【LeetCode Top 100】56. Merge Intervals【Medium】【JAVA】

本文介绍了一种用于合并多个时间碎片的算法,旨在将输入的时间片段尽可能地整合成连续的时间段,以提高时间管理效率。算法通过遍历所有碎片并尝试与已合并的碎片组进行合并,实现O(n)至O(n²)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

在这里插入图片描述

2. 题意

题目很好理解,就是输入多个时间碎片,现在需要尽可能把碎片进行合并,求合并后的结果。

3. 思路

一个比较容易想到的思路,维护一个当前的合并之后的时间碎片组,通过遍历所有的时间碎片,不断向合并之后的时间碎片组加入新的时间碎片,并将其进行合并整理即可。最佳的时间复杂度为O(n),即每次加入的碎片都可以进行合并,维护的合并之后的时间碎片组永远只有一个碎片。最差的时间复杂度为O(n²),即每次加入的碎片都无法进行合并,每次加入都只能与之前加入的所有碎片进行比较。

4. 解题代码

	public int[][] merge(int[][] intervals) {
		// 当输入为空,或碎片数不大于1时,可直接饭回
        if (intervals == null || intervals.length <= 1) {
            return intervals;
        }

        // 加入第一块时间碎片
        List<int[]> lists = new ArrayList<>();
        lists.add(intervals[0]);

        // 遍历所有的时间碎片
        for (int i = 1; i < intervals.length; i++) {
            int[] newInter = intervals[i];
            
            // 与维护的合并后的时间碎片组进行新一轮的合并
            for (int j = 0; j < lists.size(); j++) {
                int[] oldInter = lists.get(j);
                
                // 判断两个时间碎片是否有交集
                if (overlap(oldInter, newInter)) {
                	// 有交集,即将原来的时间碎片与待放入的时间碎片进行合并
                    newInter[0] = Math.min(oldInter[0], newInter[0]);
                    newInter[1] = Math.max(oldInter[1], newInter[1]);
                    // 清除原来的时间碎片
                    lists.remove(j--);
                }
            }
            // 将整合结果放入
            lists.add(newInter);
        }

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

    /**
     * 判断两个时间碎片是否有交集
     */
    private boolean overlap(int[] oldInter, int[] newInter) {
        return (oldInter[1] >= newInter[0] && newInter[1] >= oldInter[0]);
    }

5. 运行结果

在这里插入图片描述

6. 相关链接

本题代码的github链接
其他 LeetCode 题目解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值