【leetcode-Python】-区间问题-56. Merge Intervals

题目链接

https://leetcode.com/problems/merge-intervals/

题目描述

给定区间集合intervals,其中单个区间为intervals[i] = [start_i,end_i],合并所有重叠的区间,并返回一个不重叠的区间集合,该集合需要恰好覆盖输入中的所有区间。

示例

输入:intervals=[[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

由于区间[1,3]和[2,6]重叠,将它们合并为[1,6]

解题思路

对于区间类的问题最好画图思考,先建立直观感觉然后思考解决问题的方案。同时区间问题大多会事先排序。为了更方便地找到重叠的区间,先对区间按照start的大小进行排序。通过遍历遇到一个重叠区间,就将两个区间合并(由于已知后面的区间start一定小于前面区间的start,因此如果

两个区间有重叠,在合并时只需要更新end为两个区间中较大的end,start仍取原来的那个值)。

将区间集合中的区间按照start(区间左端点)从小到大的顺序排序。用result存储最终的合并结果。首先将第一个区间加入result,然后依次考虑后面的区间:
(1)如果当前区间(设为cur)的start大于result中最后一个区间(last)的end,说明两个区间没有重叠,因此直接将这个区间加入result。

(2)如果当前区间(cur)的start小于等于result中最后一个区间(last)的end,说明两个区间有重叠,因此需要更新result中最后一个区间的右端点,将它设置为cur和last中右端点的较大值。

下面举例说明操作步骤:

给定输入区间集合intervals=[[1,3],[7,8],[2,6],[[8,10]],先按照start大小升序排序。

首先将[1,3]加入result(用涂红表示)。此时result = [[1,3]]

然后顺序遍历区间集合,遍历到[2,6]时发现[2,6]和[1,3]有重叠,因此这两个区间合并为[1,6]:直接对result中的最后一个数组进行修改,即将end值修改为[1,3]、[2,6]中较大的end值。此时result = [[1,6]]

然后继续遍历,[7,8]和[1,6]没有重叠,因此无法合并,将[7,8]加入result。result在最后一个元素之前的所有元素都是已经合并好了的,不会再有变动。

继续遍历,[7,8]和[8,10]有重叠,因此将[8,10]和[7,8]合并为[7,10],result为[[1,6],[7,10]]。

Python实现

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        result = []
        intervals.sort(key = lambda interval:interval[0]) #按照start排序
        for interval in intervals:
            #如果result为空或当前区间的开始大于上一个区间的结束(不重叠),则将当前区间加入result
            if not result or interval[0] > result[-1][1]:
                result.append(interval)
            else:#如果interval[0] <= result[-1][1],说明有重叠,那么就更新result[-1]的end
                result[-1][1] = max(interval[1],result[-1][1])
        return result
                

扩展

【leetcode-Python】-贪心策略-452. Minimum Number of Arrows to Burst Balloons

【leetcode-Python】-贪心策略-435. Non-overlapping Intervals

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值