题目描述
描述
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
要求:空间复杂度O(n),时间复杂度O(nlogn)
进阶:空间复杂度O(val),时间复杂度O(val)
示例1
输入:
[[10,30],[20,60],[80,100],[150,180]]
返回值:
[[10,60],[80,100],[150,180]]
示例2
输入:
[[0,10],[10,20]]
返回值:
[[0,20]]
解题思路
解法 排序然后合并
1.先将list排序,以start从小到大排序,如果start相等,则以end从小到大排序
2.从index==1,开始遍历list,针对于每两个元素,有以下三种情况
- 情况一:当前区间完全覆盖上一区间覆盖,则我们直接更新此区间,把上一个区间合入当前区间
- 情况二:当前区间的左端点严格大于上一区间的右端点,则表示该区间不能合并,则把上一区间加入结果数据
- 情况三:当前区间与上一区间有相等的区域,那么我们自己合并这两个区间,这儿有个取巧的办法,就是直接求两个start的min,两个end的max,则为合并后的区间
3.遍历完成,记得把区间的最后一个加入结果
实践代码
解法
import java.awt.image.ImagingOpException;
import java.util.*;
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
ArrayList<Interval> res = new ArrayList<>();
if (intervals == null || intervals.size() <= 0) {
return res;
}
Collections.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start != o2.start) {
return o1.start - o2.start;
} else {
return o1.end - o2.end;
}
}
});
for (int i = 1; i < intervals.size(); i++) {
if (intervals.get(i).start <= intervals.get(i - 1).end) {
intervals.get(i).start = Math.min(intervals.get(i - 1).start, intervals.get(i).start);
intervals.get(i).end = Math.max(intervals.get(i - 1).end, intervals.get(i).end);
} else if (intervals.get(i).start > intervals.get(i - 1).end) {
res.add(intervals.get(i - 1));
}
}
res.add(intervals.get(intervals.size() - 1));
return res;
}
}