难度:中等
以数组 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] 可被视为重叠区间。
这道题的同类型题目很多,就是在求多个区间的合并与范围题目,类似的题目有:
- 首先,对于当前数组,需要机型排序是毋庸置疑的,那么是基于每个子数组的start还是end排序呢?
- 当然是start,因为我们要取最左边界和最右边界,左边界通过排序,右边界通过比较。
- 我们将排序后的intervals[0]的左右端点当做start和end,之后从1-len(intervals)开始比较。
- 当intervals[i][0] > end,标识此处断开。此时将start和end加入ret待返回的数组。
- 当intervals[i][0] < end,标识此处未断开。此时end 应该等于max(end,intervals[i][1])
- 之后intervals[i]的左右边界作为新的start和end。
- 持续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