Skip to content

Latest commit

 

History

History
70 lines (53 loc) · 2.88 KB

File metadata and controls

70 lines (53 loc) · 2.88 KB

https://leetcode-cn.com/problems/merge-intervals/solution/56he-bing-qu-jian-pai-xu-tan-xin-by-qing-3jm4/

难度:中等

题目:

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

提示:

  • 1 <= intervals.length <= 10 ^ 4
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 10 ^ 4

示例:

示例 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. 首先,对于当前数组,需要机型排序是毋庸置疑的,那么是基于每个子数组的start还是end排序呢?
  2. 当然是start,因为我们要取最左边界和最右边界,左边界通过排序,右边界通过比较。
  3. 我们将排序后的intervals[0]的左右端点当做start和end,之后从1-len(intervals)开始比较。
  4. 当intervals[i][0] > end,标识此处断开。此时将start和end加入ret待返回的数组。
  5. 当intervals[i][0] < end,标识此处未断开。此时end 应该等于max(end,intervals[i][1])
  6. 之后intervals[i]的左右边界作为新的start和end。
  7. 持续4、5、6 操作,知道数组遍历结束。此时最后一个数组没有比较,则直接将start和当前的end加入ret待返回数组。 8.返回ret即可

解题:

class Solution:
    def merge(self, intervals):
        ret = []
        intervals = sorted(intervals, key=lambda x: x[0])
        start, end = intervals[0]
        for i in range(1, len(intervals)):
            if intervals[i][0] > end:
                ret.append([start, end])
                start = intervals[i][0]
            end = max(end, intervals[i][1])
        ret.append([start, end])
        return ret

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

有喜欢力扣刷题的小伙伴可以加我微信(King_Uranus)互相鼓励,共同进步,一起玩转超级码力!

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown