56 合并区间
题目:以数组 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].
思考:
- 将原数组按照左端点排序
- 比较右端点大小
- res不能合并当前[left,right],比如res=[1,6],[left,right]=[8,10]
- res可以合并当前[left,right],比如res=[1,3]、[left,right]=[2,6]
public class Solution {
/**
* 合并区间
* 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
* 输出:[[1,6],[8,10],[15,18]]
*/
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[0][2];
}
// 将原数组按照左端点排序
Arrays.sort(intervals, Comparator.comparingInt(num -> num[0]));
List<int[]> res = new ArrayList<>();
for (int[] interval : intervals) {
int left = interval[0];
int right = interval[1];
int last = res.size() - 1;
// res不能合并当前[left,right],比如res=[1,6],[left,right]=[8,10]
if (res.isEmpty() || res.get(last)[1] < left) {
// 直接放入即可
res.add(new int[]{left, right});
} else {
// res可以合并当前[left,right],比如res=[1,3]、[left,right]=[2,6]
// 放入较大的右端点
res.get(last)[1] = Math.max(res.get(last)[1], right);
}
}
// 链表集合集转化为二维数组int[][]
return res.toArray(new int[res.size()][]);
}
public static void main(String[] args) {
Solution solution = new Solution();
int[][] nums = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
System.out.println(Arrays.deepToString(solution.merge(nums)));
}
}