题目
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
分析
首先对区间的start进行升序排序,排序好之后,遍历集合,将可以合并的区间进行合并。
在合并的时候注意的是
Interval temp = new Interval(intervals.get(i).start,Math.max(intervals.get(j).end,intervals.get(i).end));
这里,[1,5] [2,6] 合并结果是 [1,6 ] 而 [1,5] [2,3] 合并结果为[1,5],这个大小比较要加上
Math.max(intervals.get(j).end,intervals.get(i).end))
提交之后还看到了一种方法,觉得很好啊,将区间的start和end分别进行了升序排序,保存到了两个数组中去,然后遍历数组,当end中的数字处于start[i]<end[k]<start[i+1]这种情况时,将集合加入结果集中。
代码
/**
* 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) {
List<Interval> list = new ArrayList<>();
//list进行排序 对start升序排序
intervals.sort(new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
return o1.start-o2.start;
}
});
//[1,3],[2,6],[8,10],[15,18]
//遍历数组合并
for (int i = 0; i < intervals.size();) {
int j = i + 1;
for (; j < intervals.size(); j++) {
if(intervals.get(i).end >= intervals.get(j).start){
Interval temp = new Interval(intervals.get(i).start,Math.max(intervals.get(j).end,intervals.get(i).end));
intervals.set(i,temp);
}else {
list.add(intervals.get(i));
i = j;
break;
}
}
if (j == intervals.size()){
list.add(intervals.get(i));
i = j;
}
if ( i == intervals.size()-1 ){
list.add(intervals.get(i));
i++;
}
}
return list;
}
}