14.合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
先按照 intervals[][0] 排序,再判断两种情况1、当前区间左边界 ≤ 已合并区间右边界【重叠】 2、不重叠 将当前区间加入merged[]
核心逻辑:排序后,只需要维护一个 “当前合并区间”,逐个比较后续区间是否和它重叠,重叠就合并,不重叠就把它存入结果并切换当前区间。
1 class Solution { 2 public static void sortTwoDArrayByFirstElement(int[][] array) { 3 Arrays.sort(array, (o1, o2) -> o1[0] - o2[0]); 4 } 5 6 public int[][] merge(int[][] intervals) { 7 // 1. 处理空输入 8 if (intervals == null || intervals.length == 0) { 9 return new int[0][0]; 10 } 11 12 // 2. 按区间起始值升序排序 13 sortTwoDArrayByFirstElement(intervals); 14 15 // 3. 初始化合并结果和当前合并区间 16 List<int[]> merged = new ArrayList<>(); 17 // 取第一个区间作为初始合并区间 18 int[] current = intervals[0]; 19 // 先把初始区间加入结果 20 merged.add(current); 21 22 // 4. 遍历后续所有区间(从第二个开始也可以,从第一个开始也能运行,只是多一次比较) 23 for (int[] interval : intervals) { 24 int currentEnd = current[1]; // 已合并区间的右边界 25 int nextStart = interval[0]; // 当前遍历区间的左边界 26 int nextEnd = interval[1]; // 当前遍历区间的右边界 27 28 // 核心判断:是否重叠(当前区间左边界 ≤ 已合并区间右边界) 29 if (nextStart <= currentEnd) { 30 // 重叠则合并:更新已合并区间的右边界为两者最大值 31 current[1] = Math.max(currentEnd, nextEnd); 32 } else { 33 // 不重叠:将当前区间设为新的合并区间,并加入结果 34 current = interval; 35 merged.add(current); 36 } 37 } 38 // 5. 转换List为二维数组并返回 39 return merged.toArray(new int[merged.size()][]); 40 } 41 }

浙公网安备 33010602011771号