标签:span ret 写法 sort err etc sum void har
public interface Intervals { /** * Adds an interval [from, to] into internal structure. */ void addInterval(int from, int to); /** * Returns a total length covered by intervals. * If several intervals intersect, intersection should be counted only once. * Example: * * addInterval(3, 6) * addInterval(8, 9) * addInterval(1, 5) * * getTotalCoveredLength() -> 6 * i.e. [1,5] and [3,6] intersect and give a total covered interval [1,6] * [1,6] and [8,9] don‘t intersect so total covered length is a sum for both intervals, that is 6. * * _________ * ___ * ____________ * * 0 1 2 3 4 5 6 7 8 9 10 * */ int getTotalCoveredLength(); }
版上常见的那个interval题目, 要实现一个接口,实现addInterval和getTotalCoverage两个函数。 基本算是leetcode的两个interval题目的变种, 第一遍bug free写了一个add O(n)和get O(1)的方法, 然后交流了一下之后做了些小优化。 followup是问有没有让add方法更efficient的写法, 然后我说了下add O(1), get O(nlogn)的方法, 然后又讨论了一些优化的问题
// add Time O(1), get Time O(nlgn)
class MyIntervals { List<Length> l = new LinkedList<Length>(); public void addInterval(int from, int to) { l.add(new Length(from,to)); } public int getTotalCoveredLength(){ if (l == null || l.size() == 0) { return 0; } Comparator<Length> comp = new Comparator<Length>() { @Override public int compare(Length o1, Length o2) { return o1.x == o2.x ? o1.y - o2.y : o1.x - o2.x; } };// ";"不能漏 Collections.sort(l, comp); int ans = 0; ans += l.get(0).y - l.get(0).x; for (int i = 1; i < l.size(); i++) { if (l.get(i).y <= l.get(i - 1).y) { continue; } if (l.get(i).x < l.get(i - 1).y) { ans += l.get(i).y - l.get(i - 1).y; } else { ans += l.get(i).y - l.get(i).x; } } return ans; } } class Length{ public int x, y; public Length(int x, int y) { this.x = x; this.y = y; } }
// add Time O(n), get Time O(1)
class MyIntervals { List<int[]> intervals = new LinkedList<int[]>(); int sum = 0; public void addInterval(int from, int to) { if (intervals == null) { int[] temp = new int[]{from, to}; sum = to - from; intervals.add(temp); return; } List<int[]> result = new LinkedList<int[]>(); int insertPos = 0; int len = 0; int[] newInterval = new int[]{from, to}; for (int[] cur : intervals) { if (cur[1] < newInterval[0]) { result.add(cur); len += cur[1] - cur[0]; insertPos++; } else if (cur[0] > newInterval[1]) { result.add(cur); len += cur[1] - cur[0]; } else { newInterval[0] = Math.min(newInterval[0], cur[0]); newInterval[1] = Math.max(cur[1], newInterval[1]); } } len += newInterval[1] - newInterval[0]; result.add(insertPos, newInterval); intervals = result; sum = len; return; } public int getTotalCoveredLength() { return sum; } }
标签:span ret 写法 sort err etc sum void har
原文地址:http://www.cnblogs.com/apanda009/p/7927904.html