56. 合并区间

 

直观理解​

  1. ​合并区间​​:

    • 按起始排序后,合并过程只需关注当前区间与前一个合并后的区间是否重叠,无需回溯。
    • ​合并后的结束时间越大,越可能覆盖后续重叠​​。
  2. ​无重叠区间​​:

    • 按结束时间排序后,每次选择最早结束的区间,能最大化后续可选区间数量。
    • ​结束越早,留给后续的“时间窗口”越长​​。

​数学证明(无重叠区间贪心正确性)​

假设存在一个最优解 A,其中第一个区间是 x(非最早结束的区间)。
将 x 替换为排序后的第一个区间 y(结束时间更早),则 y 的结束时间 ≤ x 的结束时间,因此替换后的解 A' 仍然有效且保留的区间数不变。
通过归纳法可证,贪心策略总能得到最优解。


​总结​

  • ​合并区间​​需要确保所有可能的重叠被覆盖,按起始时间排序便于连续合并。
  • ​无重叠区间​​需要最大化保留数量,按结束时间排序能保证每次选择的区间为后续留出最大空间。
    两种策略均基于贪心思想的局部最优性,但问题目标不同导致排序依据截然相反。

思路: 合并区间,要先进行排序,将相邻的区间排在一块,判断上一个区间的末尾和当前区间的开始,如果当前区间的开始在上一个区间的结尾,那么就是重复区间,就要合并

重叠​​:当前区间的结束点 ≥ 下一个区间的起始点时,合并并更新当前区间的结束点。

不重叠​​:将当前区间加入结果列表,并更新为下一个区间。

 第一种,判断他们是重复区间之后,判断一下他们两个的结束点谁大,谁大谁就是合并区间后的结尾。

第三种直接把当前区间加到result区间中。

好的,我很乐意为您解释力扣56题"合并区间"的Python解法。 力扣56题"合并区间"是一个经典的区间问题。题目要求我们将一个包含多个重叠区间的列表合并成不重叠的区间列表。 以下是一个Python解法: ```python class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: # 首先按区间的起始位置排序 intervals.sort(key=lambda x: x[0]) merged = [] for interval in intervals: # 如果当前区间与结果列表中的最后一个区间不重叠,直接添加 if not merged or merged[-1][1] < interval[0]: merged.append(interval) else: # 否则,有重叠,更新结果列表中最后一个区间的结束位置 merged[-1][1] = max(merged[-1][1], interval[1]) return merged ``` 这个解法的主要步骤如下: 1. 首先,我们按每个区间的起始位置对输入的区间列表进行排序。 2. 然后,我们初始化一个空的合并结果列表。 3. 我们遍历排序后的区间列表: - 如果当前区间与结果列表中的最后一个区间不重叠,我们就直接将当前区间添加到结果列表中。 - 如果有重叠,我们就更新结果列表中最后一个区间的结束位置为当前区间和原最后一个区间结束位置的最大值。 4. 最后,我们返回合并后的结果列表。 这个算法的时间复杂度是O(n log n),其中n是区间的数量,主要是因为我们进行了排序操作。空间复杂度是O(n),用于存储结果。 这个解法的高效之处在于通过排序简化了重叠区间的判断过程,使得我们只需要比较结果列表中的最后一个区间和当前区间就可以决定如何处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值