Hot100 - 合并区间

Hot100 - 合并区间

image-20241127013845881

最佳思路:
先根据区间的左边界进行排序,然后采用类似贪心的方式进行合并。每次取出一个区间,与结果列表中的最后一个区间进行比较,如果能合并,则更新合并后的区间,否则直接将当前区间加入结果列表。

时间复杂度:
O(n log n),其中 n 为 intervals 数组的长度。排序是该算法的瓶颈。

代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> ans = new ArrayList<>();
        // 按照每个区间的左边界排序
        Arrays.sort(intervals, (p, q) -> p[0] - q[0]);
        
        for (int[] p : intervals) {
            int m = ans.size();
            // 如果当前区间与最后一个区间可以合并
            if (m > 0 && ans.get(m - 1)[1] >= p[0]) {
                ans.get(m - 1)[1] = Math.max(ans.get(m - 1)[1], p[1]); // 合并
            } else {
                ans.add(p); // 无法合并,直接添加
            }
        }
        
        // 转换为二维数组返回
        return ans.toArray(new int[ans.size()][]);
    }
}

思路:

  1. 排序:首先将所有区间按左边界升序排序,确保我们按顺序处理区间。
  2. 遍历合并:遍历排序后的区间,检查当前区间能否与结果列表中的最后一个区间合并。如果可以合并,则更新最后一个区间的右边界;如果不能合并,则将当前区间添加到结果列表中。
  3. 转换并返回:最后将 List<int[]> 转换为二维数组 int[][] 返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值