合并区间问题

举报
程序员学长 发表于 2021/12/15 18:30:06 2021/12/15
【摘要】 合并区间读前福利,送大家一些电子书 问题描述 56. 合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。输入:intervals = [ [1,3],[2,6],[8,10],[15,18] ]输出:[ [1,6],[8...

合并区间

读前福利,送大家一些电子书

问题描述

56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

输入:intervals = [ [1,3],[2,6],[8,10],[15,18] ]
输出:[ [1,6],[8,10],[15,18] ]
解释:区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6]

分析问题

对于任意两个区间A和B,它们之间的关系可以有以下6种情况。

![image-20211019103253406](/Users/hanlulu/Library/Application Support/typora-user-images/image-20211019103253406.png)

我们将这两个区间进行比较、交换,使得第一个区间的起始位置 ≤ 第二个区间的起始位置这个条件成立,这样的话,我们就可以把这6种情况转换成以下3种。

![image-20211019103722071](/Users/hanlulu/Library/Application Support/typora-user-images/image-20211019103722071.png)

按照这个思路,我们将所有区间按照左端点进行排序,那么就可以保证任意连续的两个区间,第一个区间的起始位置 ≤ 第二个区间的起始位置,所以他们的关系只有上面三种情况。

算法

对于上面的三种情况,我们可以采用如下算法来求解。

首先,我们用数组 merged 存储最终的答案。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:

  • 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,即上图中的第二种情况,那么它们不会重合。我们可以直接将这个区间加入数组 merged 的末尾;

  • 否则,它们是有重合部分的,即上图中的第一、三种情况,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。

这样,我们就可以解决上述的三种情况,下面我们来看一下代码的实现。

class Solution:
    def merge(self, intervals):
        #将区间数组按照左端点进行升序排序
        intervals.sort(key=lambda x: x[0])
        #存放合并后的结果
        merged = []
        for interval in intervals:
            #如果列表为空
            #或者当前区间的左端点大于merged最后一个元素的右端点,直接添加
            if not merged or merged[-1][1] < interval[0]:
                merged.append(interval)
            else:
                #否则的话,我们就可以与上一区间进行合并
                #修改merged最后一个元素的右端点为两者的最大值
                merged[-1][1] = max(merged[-1][1], interval[1])
        return merged

该算法的时间复杂度是O(nlogn),其中n是区间的数量,除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O*(*n logn)。

空间复杂度是O(logn)。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。