题目
给出一个区间的集合,请合并所有重叠的区间。
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
分析
将数组元素按照左边界进行排序。将第一个数组加入到结果集中,如果下一个数组的左边界的值小于前一个数组的右边界的值,就更新右边界。
代码
public int[][] merge(int[][] intervals) {
//res是一个列表,每个元素是数组。toarray是将最后输出的时候列表转换为数组。
List<int []>res = new ArrayList<>();
if(intervals.length==0||intervals==null){
return res.toArray(new int[0][]);
}
//将数组按照最左边元素大小进行升序排列
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return a[0]-b[0];
}
});
int i = 0;
while(i<intervals.length){
//可合并数组的左边界
int left = intervals[i][0];
//数组的右边界
int right = intervals[i][1];
//下一个数组的左边界是否小于前一个数组的右边界,小于则就可以进行合并
//只是判断,i+1不更新i的值
//这个循环会将连续的可以合并的数组都合并起来
while(i<intervals.length-1&&intervals[i+1][0]<=right){
i++;
right = Math.max(right,intervals[i][1]);
}
res.add(new int[]{left,right});
//接着判断下一个
i++;
}
//将列表数组转换为二维数组
return res.toArray(new int[0][]);
}