WELCOME TO Pluto134340小行星

清风湿润,茶烟轻扬。

14.合并区间

LCR 074. 合并区间

以数组 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 }
View Code

 

posted @ 2026-01-16 10:01  Pluto134340  阅读(2)  评论(0)    收藏  举报