题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
题目解答:
class Solution {public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>();int len = intervals.length;if (len == 0)return res.toArray(new int[0][]);Arrays.sort(intervals, (a, b) -> a[0] - b[0]);for (int i = 0; i < len; i++) {int left = intervals[i][0];int right = intervals[i][1];while (i < len - 1 && intervals[i + 1][0] <= right) {i++;right = Math.max(right, intervals[i][1]);}res.add(new int[] { left, right });}return res.toArray(new int[0][]);}
}
题目思路:
首先,对输入的区间数组按照起始位置进行升序排序。
遍历排序后的区间数组,使用两个指针 left 和 right 来表示当前合并的区间。
在遍历过程中,如果当前区间的起始位置小于等于 right,说明存在重叠,更新 right 为当前区间的结束位置。
如果不存在重叠,则将当前合并的区间 [left, right] 添加到结果列表中,并更新 left 和 right 为当前区间的起始和结束位置。
最后,将结果列表转换为数组并返回。
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
这一行代码使用了 Arrays
类的 sort
方法对二维数组 intervals
进行排序。排序的依据是每个子数组的第一个元素(即区间的起始位置)。
intervals
: 要排序的数组。(a, b) -> a[0] - b[0]
: 这是一个 Lambda 表达式,它定义了一个比较器(Comparator)。该比较器用于确定数组中两个元素的相对顺序。具体来说,它按照每个子数组的第一个元素进行升序排序。Lambda 表达式(a, b) -> a[0] - b[0]
返回的是一个负数、零或正数,表示a
小于、等于或大于b
。
res.toArray(new int[0][])
这一行代码将 List<int[]>
类型的 res
转换为 int[][]
类型的数组。
-
res.toArray()
: 这是List
接口的一个方法,用于将列表转换为数组。在这里,res
是一个List<int[]>
类型的列表,表示存储合并后的区间。调用toArray()
方法会返回一个Object[]
类型的数组。 -
(new int[0][])
: 这一部分是为了指定返回的数组类型。在 Java 中,由于泛型擦除的原因,toArray()
方法只能返回Object[]
类型的数组。为了转换为指定类型的数组,我们需要提供一个具体类型的数组作为参数。在这里,(new int[0][])
创建了一个空的int[][]
类型的数组,然后通过(int[0][])
强制转换为int[][]
类型。