leetcode 57: Insert Interval

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值