Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
给出一个无重叠的,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序而且不重叠(如果有必要的话,可以合并区间)
排序法
这个和前一题的解法相似
先插入–排序–合并
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
result=[]
intervals.append(newInterval)
#sort intervals based on the start time
intervals.sort(key=lambda x:x[0])
for interval in intervals:
if len(result)==0 or result[-1][1]<interval[0]:
result.append(interval)
else:
result[-1][1]=max(result[-1][1],interval[1])
return result
(1)时间复杂度:排序算法的时间复杂度是NlogN,下面的for循环的时间复杂度是N,因此该算法的时间复杂度是NlogN
(2)空间复杂度:因为新增加了result, 因此为N
贪心法
greedy
思想:
每一步都选择最佳的解决方法
- 所有开始时间<=new:则直接加入结果中 (开始时间<newinterval[0])
- 把newInterval区间放到结果集:和前一个元素合并以及放入一个新的元素
- 把之后所有的interval放入结果中:如果end>=start,则合并;若end<=start,则直接加入
class Solution:
#greedy solution
#N is the size of intervals+newintervals
#time complexity: O(N)
#space complexity: O(N)
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
result=[]
index=0
#Put all intervals into result when the start time smaller than newInterval start time
for interval in intervals:
if interval[0]<newInterval[0]:
result.append(interval)
index+=1
else:
break
#Merge newInterval into result if newInterval start time larger than lastest end time in result
if len(result)==0 or result[-1][1]<newInterval[0]:
result.append(newInterval)
else:
result[-1][1]=max(result[-1][1],newInterval[1])
#Put all rest intervals into result
for i in range(index,len(intervals)):
if result[-1][1]<intervals[i][0]:
result.append(intervals[i])
else:
result[-1][1]=max(result[-1][1],intervals[i][1])
return result