题目描述
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路
//无序的区间有些难合并,但如果是按起始值从小到大排列的区间,还比较好合并
//先使用intervals.sort()对所有区间进行排序,利用eclipse等软件的错误提示,override其compare方法,按照区间的起始值开始从小到大排序
//从左到右遍历所有区间,将有重叠的两个区间进行合并,并在连续区间中断时,存到另结果list里。
//(可以新建一个区间对象pre,记录当前被合并的区间范围)
是参考了:https://blog.youkuaiyun.com/JackZhang_123/article/details/77837502,但是有所改动
代码
public List<Interval> merge(List<Interval> intervals) {
intervals.sort(new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
return o1.start - o2.start;
}});
int len = intervals.size();
if(len <= 1)//特殊情况
return intervals;
List<Interval> ret = new ArrayList<Interval>();
Interval pre = intervals.get(0);
for(int i =1; i< len; i++) {
Interval now = intervals.get(i);
if(pre.end >= now.start) {
pre.end = Math.max(pre.end, now.end);
} else {
ret.add(pre);
pre = now;
}
}
// System.out.println("添加最后一组:" + pre);
ret.add(pre);
return ret;
}
应该是o(n)复杂度,时间30ms左右,大概战胜58%