【LeetCode】56. 区间合并

区间合并

题目描述:

        以数组 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] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路分析:  

  1. 初始化合并后的区间列表:首先,创建一个空的列表 merged 来存储合并后的区间。这个列表将使用二维数组(或类似的数据结构,如 int[] 数组)来存储每个区间,其中每个区间由两个整数表示,分别代表区间的起始位置和结束位置。

  2. 遍历排序后的区间列表:由于合并操作需要基于区间的顺序进行,因此首先需要对输入的区间列表 intervals 进行排序。排序的依据通常是区间的起始位置。然后,遍历排序后的区间列表。

  3. 判断当前区间与合并后列表的关系

    • 无重叠:如果 merged 列表为空,或者当前区间的起始位置大于 merged 列表中最后一个区间的结束位置,说明当前区间与 merged 列表中的区间没有重叠。此时,直接将当前区间添加到 merged 列表中。
    • 有重叠:如果当前区间的起始位置小于或等于 merged 列表中最后一个区间的结束位置,说明当前区间与 merged 列表中的最后一个区间有重叠。此时,更新 merged 列表中最后一个区间的结束位置为当前区间结束位置和最后一个区间结束位置中的较大值,以实现合并。
  4. 返回合并后的区间列表:遍历完成后,merged 列表中存储的就是所有合并后的区间。由于题目要求返回二维数组,因此需要将 merged 列表转换为二维数组并返回。这可以通过调用 toArray 方法并传入一个正确类型的数组(这里是 new int[merged.size()][])来实现。

这种解题思路的关键在于通过遍历和比较,逐步构建出合并后的区间列表。排序步骤确保了遍历过程中可以方便地判断区间之间的重叠关系,而动态更新 merged 列表中的区间则实现了合并操作。

代码实现注解:

class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals.length == 0){
            //如果输入的区间列表为空,则直接返回一个空的二维数组  
            return new int[0][2];
        }
        // 按照区间的起始位置进行排序,如果起始位置相同,则默认保持原顺序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        // 用于存储合并后的区间列表  
        List<int[]> merged = new ArrayList<int[]>();  
        // 遍历排序后的区间列表  
        for (int i = 0; i < intervals.length; ++i) {  
            int L = intervals[i][0]; // 当前区间的起始位置  
            int R = intervals[i][1]; // 当前区间的结束位置  
            // 如果合并后的列表为空,或者当前区间的起始位置大于合并后列表中最后一个区间的结束位置  
            // 则说明当前区间与合并后的列表中的区间不重叠,直接将当前区间添加到合并后的列表中  
            if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {  
                merged.add(new int[]{L, R});  
            } 
            else {  
                // 否则,当前区间与合并后列表中的最后一个区间重叠,更新最后一个区间的结束位置为两者中的较大值  
                merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);  
            }  
        }  
        // 将合并后的列表转换为二维数组并返回  
        return merged.toArray(new int[merged.size()][]);  
    }  
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值