Java 解算法:合并区间

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

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]


这个题的目标是合并所有重叠的区间。解题思路是,先把数组的元素进行排序,再合并区间。

为什么要排序呢?因为将区间按照起始元素排序,才能让我们非常清晰地识别重叠的区间。

排序:首先,根据每个区间的起始元素对区间进行排序(按照首元素从小到大排)。

合并:然后,遍历排序后的区间列表,检查当前区间是否与前一个区间重叠。 如果重叠,合并这两个区间;如果不重叠,将当前区间添加到结果列表中。

具体步骤:

  1. 排序:使用 Arrays.sort 方法对区间进行排序,排序的依据是每个区间的起始元素大小。

  2. 合并:使用一个 LinkedList 来存储合并后的区间。遍历排序后的区间列表,对于每个区间,检查它是否与 LinkedList 中最后一个区间重叠。如果重叠,合并这两个区间;如果不重叠,将当前区间添加到 LinkedList 中。

  3. 返回结果:将 LinkedList 转换为数组并返回。

我的Java代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length <= 1) {
            return intervals;
        }
        
        // 按照首元素对区间进行排序。 lambda 表达式定义排序的规则:首元素小的区间排在前面。
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        
        LinkedList<int[]> merged = new LinkedList<>();
        merged.add(intervals[0]);
        int length = intervals.length;
        
        for (int i = 1; i < length; i++) {
            int[] current = intervals[i];
            int[] lastMerged = merged.getLast();
            
            // 检查当前区间是否与最后一个合并的区间重叠
            if (current[0] <= lastMerged[1]) {
                // 合并区间
                lastMerged[1] = Math.max(lastMerged[1], current[1]);
            } else {
                // 不重叠,将当前区间添加到结果列表中
                merged.add(current);
            }
        }
       
        return merged.toArray(new int[merged.size()][]);
    }
}
posted @ 2025-07-23 23:12  junjunyi  阅读(44)  评论(0)    收藏  举报