JAVA解法
class Solution {
public int[][] merge(int[][] intervals) {
// 定义结果集
List<int[]> res = new ArrayList<>();
// 若传进来的 intervals 为空,则直接返回,记得 toArray 成题目最终返回要求
if (intervals.length == 0 || intervals == null){
return res.toArray(new int[0][]);
}
// 这是函数式编程,实现的是 Comparator 接口,对起点进行从小到大排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
// 定义一个循环维护的变量
int i = 0;
// 当 i 的值小于 intervals 中的集合个数时,进入循环
while (i < intervals.length) {
// 每次遍历都取出区间的左右端点
int left = intervals[i][0];
int right = intervals[i][1];
// 若当前区间的右端点比下一个区间的左端点还大,则说明区间有重叠
while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
// 将当前右端点的值与下一个区间右端点的值进行比较,取较大的值作为新区间右端点
right = Math.max(right, intervals[++i][1]);
}
// 将新区间放入结果集中
res.add(new int[]{left, right});
// 接着判断下一个区间
i++;
}
// 返回最终结果集,将 List<int[]> 类型转换成 0 行 n 列的格式的数组类型 ,即一维数组转二维数组
return res.toArray(new int[0][]);
}
}
题解分析
合并区间就是将有重叠区间的两个区间合成一个。首选定义一个存放 int 类型数组的集合作为临时结果集,对传进来的二维数组进行判空,若传进来的 intervals 为空,则直接返回,由于结果集是临时的结果集,记得将一维数组的集合 toArray 成题目最终返回要求的二维数组。利用函数式编程,实现 Comparator 接口,对起点进行从小到大排序,跟 foreach 类似。
定义一个循环维护的变量,当 i 的值小于 intervals 中的集合个数时,进入循环,确保能遍历到最后一个区间,每次遍历都取出区间的左右端点,若当前区间的右端点比下一个区间的左端点还大,则说明区间有重叠,将当前右端点的值与下一个区间右端点的值进行比较,取较大的值作为新区间右端点,将新区间放入结果集中并接着判断下一个区间,最后返回最终结果集,将 List<int[]> 类型转换成 0 行 n 列的格式的数组类型返回即可。
leetcode原题:56. 合并区间
评论区