Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
start 1 2 8 15
end 3 6 10 18
当start[i] > end[i-1]时,此前的区间才没有重合,按照这个思路可以写代码如下,超过99.69%的提交:
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> merge(List<Interval> intervals) {
if (intervals.size() < 2) {
return intervals;
}
List<Interval> res = new ArrayList<Interval>();
int[] start = new int[intervals.size()];
int[] end = new int[intervals.size()];
for (int i = 0; i < start.length; i ++) {
start[i] = intervals.get(i).start;
end[i] = intervals.get(i).end;
}
Arrays.sort(start);
Arrays.sort(end);
int begin = 0;
for (int i = 1; i < start.length; i ++) {
if (start[i] > end[i - 1]) {
Interval temp = new Interval(start[begin], end[i - 1]);
res.add(temp);
begin = i;
}
}
if (begin == start.length - 1) {
Interval temp = new Interval(start[begin], end[begin]);
res.add(temp);
} else {
Interval temp = new Interval(start[begin], end[start.length - 1]);
res.add(temp);
}
return res;
}
}
下面那个for可以简化为下面的代码,不过会牺牲到98%的超过率:
List<Interval> res = new ArrayList<Interval>();
for (int i = 0, j = 0; i < n; i++) { // j is start of interval.
if (i == n - 1 || starts[i + 1] > ends[i]) {
res.add(new Interval(starts[j], ends[i]));
j = i + 1;
}
}
return res;