LeetCode ----435 无重叠区间

本文介绍了解决区间集合去重问题的三种算法实现方法,并通过具体示例对比了不同方法的时间和空间复杂度。

这几天PPT快做🤮了,不过终于放假咯😋

一、题目

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-overlapping-intervals

二、解法

1.最初的解法

没有注意到的是需要找到满足条件的弹出最小区间的数量,因此排序之后的数组,要满足不重叠条件要求并且区间间距要尽量小,这样才容的下更多的区间。
最初没有注意最小区间数量,所以解答错误,在原解上,增加筛选条件即可:

def solution(intervals):
    if not len(intervals):
        return 0
    out = 0
    intervals.sort()  #以开始节点排序
    reserve = intervals[0]
    for i in range(1,len(intervals)):
        if intervals[i][0] >= reserve[1] :
            reserve = intervals[i]  #满足不重叠条件 可以保留
        elif intervals[i][1] <= reserve[1]  :  # 区间间距更小的保留,不符合的弹出
            out += 1
            reserve = intervals[i]
        else:
            out += 1  # 不满足条件,直接弹出
    return out

   # Run time: 84ms Memory consump:17.9MB

2.以开始节点排序,从右往左找

参考题解中采用的贪心算法,对排序之后的区间进行遍历,将符合条件的区间间距最小的留下:

def solution(intervals):
    if not len(intervals):
        return 0
    save = 1
    n = len(intervals)
    intervals.sort()
    reserve = intervals[n-1][0]
    for i in range(n-2,-1,-1):
        if intervals[i][1] <= reserve :
            save += 1
            reserve = intervals[i][0]
    return n - save
    
   # Run time: 88ms Memory consump:17.8MB

3.以结束节点排序,从左往右找

def solution(intervals):
    if not len(intervals):
        return 0
    save = 1
    n = len(intervals)
    intervals.sort(key = lambda x : x[1])
    reserve = intervals[0][1]
    for i in range(1,len(intervals)):
        if intervals[i][0] >= reserve :
            save += 1
            reserve = intervals[i][1]
    return n - save
    
 # Run time: 80ms Memory consump:17.8MB
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值