每天更新一道python leetcode题,力求讲解清晰准确,客官们可以点赞或者关注。
题目:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2:
输入: intervals =[[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval =[4,8]
输出: [[1,2],[3,10],[12,16]] 解释: 这是因为新的区间[4,8]
与[3,5],[6,7],[8,10]
重叠。
这道题与上一道题非常相似,我们只需把新的区间加入旧的区间中,然后在合并输出即可。
本着完成题目的原则,这里再次说明一下解题分析:
算法过程(伪代码):
遍历输入,把能融合的融合,不能融合的不管跳过。
算法证明:
当我们把原输入按照开始的第一项排序后,我们能保证以下2点:
1. 出现断层,则前一项的end一定小于后一项的start
2.更新答案时的最后一项的end永远是最大的。
既然最后一项区间的end永远最大,我们在融合的时候只需要考虑与新加入的区间与原最后一项的关系即可。
更多详细可以参考上一篇博客:leetcode 056 合并区间
class Solution:
def insert(self, intervals, newInterval):
"""
:type intervals: List[Interval]
:type newInterval: Interval
:rtype: List[Interval]
"""
intervals.append(newInterval)
intervals.sort(key = lambda x: x.start)
return self.merge(intervals)
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
#先将第一个区间加入res
res = [intervals[0]]
#遍历后面的所有区间
for i in range(1, len(intervals)):
#如果当前这个区间与上一个区间能连接得上
if intervals[i].start <= res[-1].end:
#我们尝试着去更新,注意,这个max很重要,必须要判断后再更新!!
res[-1].end = max(res[-1].end, intervals[i].end)
else:
#不能连接上就直接加入
res.append(intervals[i])
return res
思路在代码注释中写的很清楚,这里主要强调一个点。
如果你发现当前区间能与上个区间连接上的时候,res[-1].end也就是上个区间的末尾不一定会被更新,因为上个区间的末尾比这个区间的末尾有可能还要长和广。(所以我们采用max来判断)
这个是我实现的时候的错误,希望大家注意。