1、题目描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
2、算法分析
这个题不算简单。需要有二维数组的基础知识。
二维数组基础知识:
①二维数组的列排序:
// 二维数组第一列进行排序 Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]); // 二维数组第二列进行排序 Arrays.sort(intervals,(val1,val2) -> val1[1] - val2[1]);
②表示二维数组的长度:
// 表示行数 arrays.length // 表示列数 arrays[0].length
③二维数组的遍历
两个for循环遍历
使用foreach进行遍历:
for(int[] interval:intervals){
interval[i]:代表的是第i + 1列
思路:
无非就这几种情况
①先对二维数组的列进行排序,从小到大排序
Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]);
②定义结果集数组
③遍历数组,如果数组为空,或者当前区间的第1列的值大于结果集数组的最后一个值。
相当于区间之间并没有重叠,那么就将数组存储到结果集。
④如果当前第1列的值大于结果集数组的最后一个值。那么取最后一个元素的值,因为二维数组的元素是排序后的。
⑤index 从0开始,最后加1去掉多余的0
看代码:
3、代码实现
class Solution {
public int[][] merge(int[][] intervals) {
// 按照列进行排列,从小到大
Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]);
// 定义结果集
int[][] result = new int[intervals.length][2];
// 下标
int index = -1;
// 遍历二维数组
for(int[] interval:intervals){
// index == -1代表数组为空,当前第1列的值大于结果集数组的最后一个值
if(index == -1 || interval[0] > result[index][1]){
// 将interval二维数组添加到结果集数组中,当然是一列一列的添加
result[++index] = interval;
}else{
// 要不然进行合并
// 要的是最后一列的最大值进行合并
result[index][1] = Math.max(result[index][1],interval[1]);
}
}
// 去掉多余的0
return Arrays.copyOf(result,index + 1);
}
}