给定若干个区间,对重叠的区间进行合并。如[1,3],[2,6],[8,10],[15,18],合并后的区间为[1,6],[8,10],[15,18]。
方法一:先把区间根据下界进行排序,然后判断重叠和合并
/**
* 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; }
* }
*/
class Solution {
public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals, (Interval a, Interval b) -> (a.start - b.start));
int i = 1;
while(i < intervals.size()){
if(intervals.get(i).start <= intervals.get(i - 1).end){
intervals.get(i - 1).end = Math.max(intervals.get(i - 1).end, intervals.get(i).end);
intervals.remove(i);
}
else i++;
}
return intervals;
}
}
方法二:把区间转化为两个一维数组,分别排序,根据数组的大小来判断重叠。因为直接对一维数组进行排序,效率更高。
public List<Interval> merge(List<Interval> intervals) {
// sort start&end
int n = intervals.size();
int[] starts = new int[n];
int[] ends = new int[n];
for (int i = 0; i < n; i++) {
starts[i] = intervals.get(i).start;
ends[i] = intervals.get(i).end;
}
Arrays.sort(starts);
Arrays.sort(ends);
// loop through
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;
}