【快手手撕】合并区间

求解代码

java 复制代码
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没有后续区间对比,遍历结束后不会被自动加入,所以需要手动补充。

相关推荐
考虑考虑2 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_3 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
_小马快跑_3 小时前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_3 小时前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_3 小时前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_3 小时前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_3 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android
_小马快跑_3 小时前
Kotlin协程异常捕获陷阱:try-catch捕获异常失败了?
android
_小马快跑_3 小时前
Android | 权限申请与前置说明弹窗同时展示的优雅方案
android
_小马快跑_3 小时前
Android | Channel 与 Flow的异同点
android