56. 合并区间

题目-中等难度

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

示例

示例 1:

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

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. 列表排序+新建列表重排

执行用时:336 ms, 在所有 Python3 提交中击败了5.44%的用户
内存消耗:19.2 MB, 在所有 Python3 提交中击败了57.89%的用户
通过测试用例:170 / 170

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        lin = len(intervals)
        # 给列表排序
        intervals.sort()
        # 结果列表
        res = []
        # 当intervals列表中有残余项
        while intervals:
            # 添加到res中
            res.append(intervals.pop(0))
            # 对比下一项,如果可以重合,则进行重合,直到不可重合的项,进行下一次循环
            while intervals and intervals[0][0] <= res[-1][1]:
                res[-1] = [min(intervals[0][0],res[-1][0]),max(intervals[0][1],res[-1][1])]
                intervals.pop(0)
        return res

2. 原列表直接替换

执行用时:168 ms, 在所有 Python3 提交中击败了6.56%的用户
内存消耗:19 MB, 在所有 Python3 提交中击败了74.04%的用户
通过测试用例:170 / 170

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # 排序
        intervals.sort()
        # 索引从1开始
        i = 1
        # 遍历
        while i < len(intervals):
            # (x1,y1)为(x2,y2)的前一项
            x1,y1,x2,y2 = intervals[i-1][0],intervals[i-1][1],intervals[i][0],intervals[i][1]
            # 如果x2不比y1大, 两种情况
            if x2 <= y1:
                # 如果y2也没y1大
                if y2 <= y1:
                    intervals[i-1:i+1] = [[x1,y1]]
                # 如果y2比y1大
                else:
                    intervals[i-1:i+1] = [[x1,y2]]
                # 由于合并了,所以索引要-1
                i-=1
            i+=1
        return intervals

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值