1、题目描述
2、题目解析
合并区间的逻辑,第一个区间的结束位置 ≤ 第二个区间的起始位置,就可以进行这两个区间的合并,同理,合并N个区间,就是合并N-1个两两区间即可。
【贪心算法思路】区间重叠问题的处理,首先左边界排序,排序之后局部最优:每次合并都取【最大的右边界】,这样就可以合并更多的区间了,最后合并所有重叠的区间。
实现步骤:贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
具体代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length == 0) return new int[0][2];
//对intervals进行区间排序,按照区间左边进行生序
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] t1, int[] t2){
return t1[0]-t2[0];
}
});
int[][] res = new int[intervals.length][2];
//进行初始化,初始化区间跟intervals的第一个区间一致
res[0][0] = intervals[0][0];
res[0][1] = intervals[0][1];
//设置res当前区间的下标
int index = 0;
for(int i = 1; i < intervals.length; i++){
//intervals的下一个区间【左】跟res的当前区间的【右】是否重合
if(res[index][1] >= intervals[i][0]){
//进行合并
res[index][1] = Math.max(res[index][1],intervals[i][1]);
}else{
//添加新区间
index++;
res[index][0] = intervals[i][0];
res[index][1] = intervals[i][1];
}
}
//此时结果res(合并后的),真实区间长度为index+1
return Arrays.copyOf(res, index+1);
}
}
复杂度分析
时间复杂度:O(nlogn),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。
空间复杂度:O(logn),其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。O(logn) 即为排序所需要的空间复杂度。
【备注】上面代码两处难点:
1、给区间段进行排序
//对intervals进行区间排序,按照区间左边进行生序
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] t1, int[] t2){
return t1[0]-t2[0];
}
});
2、返回数组的前N个元素
Arrays.copyOf(res, index+1);