Loading...

【快手手撕】合并区间

在这里插入图片描述

求解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {

        ArrayList<Interval> ans = new ArrayList<>();

        // 边界处理:入参为null或空集合,直接返回空
        if (intervals == null || intervals.size() == 0) {
            return ans; 
        }

        // 按区间的start值升序排序
        Collections.sort(intervals, (a, b) -> (a.start - b.start));

        // 初始化【当前合并区间】为排序后的第一个区间
        Interval current = intervals.get(0);

        
        for (int i = 1; i < intervals.size(); i++) {
            // 取出当前遍历到的待对比区间
            Interval temp = intervals.get(i);
            // 重叠判断:待对比区间的start ≤ 当前合并区间的end → 两个区间重叠,需要合并
            if (temp.start <= current.end) {
                // 更新当前合并区间的end为两者end的最大值
                current.end = Math.max(current.end, temp.end);
            } else {
                // 将当前合并完成的区间加入结果集合
                ans.add(current);
                // 更新「当前合并区间」为当前遍历到的新区间,继续后续合并
                current = temp;
            }
        }

        // 手动将最后一个未加入的「当前合并区间」加入结果
        ans.add(current);

        // 返回最终合并结果
        return ans;
    }

小贴士

遍历中只有遇到非重叠区间时,才会把 上一个 current加入结果,而最后一个current没有后续区间对比,遍历结束后不会被自动加入,所以需要手动补充。

最后更新于 2026-04-05 17:35:33
Code Road Record