- 题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
- 排序
这道题不多说,需要对各个区间的左端点进行排序,排序好之后的数组每个区间之间都是连续的,不会出现两个可以合并的区间之间出现另一个区间的情况,所以只需要进行一次遍历就能把区间合并。
public int[][] merge(int[][] intervals){
// 按照左端点对数组进行排序,也可以在左端点相等的时候再对右端点进行排序,但由于后面取的是右端点的最大值,所以没什么必要
// Arrays.sort(intervals, (a1, a2) -> a1[0] == a2[0] ? a1[1] - a2[1] : a1[0] - a2[0]);
Arrays.sort(intervals, (a1, a2) -> a1[0] - a2[0]);
List<int[]> result = new ArrayList<>();
for (int i = 0; i < intervals.length; i++){
// 如果i的右端点比i+1的左端点大或相等,那这两个就可以合并了
if (i < intervals.length - 1 && intervals[i][1] >= intervals[i + 1][0])
// 合并之后的左区间肯定是等于i的左区间,但右区间要看i和i+1的右区间哪个更大
intervals[i + 1] = new int[]{intervals[i][0], Math.max(intervals[i][1], intervals[i + 1][1])};
else
result.add(intervals[i]);
}
return result.toArray(new int[result.size()][]);
}
- 这道题对我来说不熟练的部分在于sort方法的比较器的Lambda表达式写法以及其中原理;还有toArray方法的使用,下面列出了这两个问题的相关解答供和我有一样疑问的朋友参考。