七七老师の白日梦
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

合并区间:lambda排序与区间合并

写作时间:2026-07-07 16:28:05

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

是什么?

排序

怎么做?

先从小到大排序,然后再判断是否有重复区间

‍

七七的思考?

七七看到这题目的第一眼就想到ArrayList.sort,然后再排序,同时要处理特殊情况,但是这道题明显不够,这里是区间,ArrayList呢?是数组List也不行,是链表,会报错,这里需要引入lambda去排序

import java.util.*;

class Solution {
    public int[][] merge(int[][] intervals) {
//        排除特殊情况
        if (intervals == null || intervals.length == 0) {
            return new int[0][];
        }

        // 按照起始点排序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
//定义数组
        List<int[]> merged = new ArrayList<>();
//        如果merged为空或者merged最后一个元素的结束点小于当前元素的开始点,则将当前元素加入merged中
        for (int[] interval : intervals) {
            if (merged.isEmpty() || merged.get(merged.size() - 1)[1] < interval[0]) {
                merged.add(interval);
//                如果merged最后一个元素的结束点大于当前元素的开始点,则将merged最后一个元素的结束点更新为当前元素的结束点
            } else {
                merged.get(merged.size() - 1)[1] = Math.max(
                        merged.get(merged.size() - 1)[1],
                        interval[1]
                );
            }
        }

        return merged.toArray(new int[merged.size()][]);
    }
}

‍

avatar

七七老师

分享代码日常

RECOMMENDED

七七旧事:复盘并改变写博客的方式

2026-07-02 22:54:38

字母异位词

2026-07-04 22:22:08

寻找两个正序数组的中位数:合并与二分

2026-07-08 15:56:26

Table of Contents