题目:
以数组intervals
表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间
思路:
- 本题目需要先按照区间的起始索引
starti
对应的值进行递增排序 - 这样的话当前区间和下一个区间无非就两种大情况
- 待比较区间的开始值大于当前区间的结束值,那么肯定没有重合区间,直接将其加入
- 待比较区间的开始值小于等于当前区间的结束值,那么就存在重合区间了,这时就需要通过比较更新当前区间的结束值,也就是合并区间,将待比较区间的结束值和当前区间的结束值比较取出较大的那个重新赋值给当前区间的结束值
以下为代码+注释:
public int[][] merge(int[][] intervals) {
if(intervals.length == 0)
return new int[0][2];
// 先将数组按照每个区间的起始位置进行递增排序
Arrays.sort(intervals, new Comparator<int[]>(){
public int compare(int[] o1, int[] o2){
return o1[0] - o2[0];
}
});
int[][] res = new int[intervals.length][2];
int curindex = -1;
// 对每一个区间进行遍历
for(int[] interval : intervals){
// 如果是第一个区间或者当前区间的左边界比最后一个的右边界大,那么就将它加入
if(curindex == -1 || interval[0] > res[curindex][1]){
res[++curindex] = interval;
}else{
// 否则,说明出现了重合区间,那么就需要对结果数组中最后一个区间的右边界进行更新
res[curindex][1] = Math.max(res[curindex][1], interval[1]);
}
}
// 返回最后的结果
return Arrays.copyOf(res, curindex + 1);
}
笔者也在不断学习,如有错误,欢迎指正!