当前位置: 首页 > news >正文

Leetcode 435. 无重叠区间

1.题目描述

给定一个区间的集合 intervals ,其中 intervals[i] = [ s t a r t i , e n d i ] [start_i, end_i] [starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。


输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。


输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。


输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。


提示:

  • 1 <= intervals.length <= 10^5
  • intervals[i].length == 2
  • -5 * 1 0 4 10^4 104 <= starti < endi <= 5 * 1 0 4 10^4 104

2.思路分析

2.1 动态规划

题目的要求等价于「选出最多数量的区间,使得它们互不重叠」。

由于选出的区间互不重叠,因此我们可以将它们按照端点从小到大的顺序进行排序,并且无论我们按照左端点还是右端点进行排序,得到的结果都是唯一的。

先将所有的 n个区间按照左端点(或者右端点)从小到大进行排序,随后使用动态规划的方法求出区间数量的最大值。

设排完序后这 n 个区间的左右端点分别为 l 0 , ⋯ , l n − 1 l_0,⋯,l_n−1 l0,,ln1以及 r 0 , ⋯ , r n − 1 r_0,⋯,r_n−1 r0,,rn1

1.确定dp数组以及下标含义

  • dp[i]:列表从0开始到位置i之间最多的无重叠区间的个数

2.确定递推公式

  • dp[i] = max(dp[i].dp[j]+1),j是从i遍历到位置0遇到的第一个与i无重复区间的位置
  • dp[i] = max(dp[i],dp[i-1]),找到从位置0到位置i中最多的无重叠区间

3.dp数组初始化

  • dp初始化为1

4.确定遍历顺序

  • 循环外层:i 循环内层:j(反向遍历)

5.举例推导dp数组

2.2 贪心

Q: 选择哪一个区间作为首个区间?

假设在某一种最优的选择方法中, [ l k , r k ] [l_k, r_k] [lk,rk]是首个(即最左侧的)区间,那么它的左侧没有其它区间,右侧有若干个不重叠的区间。设想一下,如果此时存在一个区间 [ l j , r j ] [l_j, r_j] [lj,rj],使得 r j < r k r_j < r_k rj<rk,即区间 j 的右端点在区间 k 的左侧,那么我们将区间 k 替换为区间 j,其与剩余右侧被选择的区间仍然是不重叠的。而当我们将区间 k 替换为区间 j 后,就得到了另一种最优的选择方法。

我们可以不断地寻找右端点在首个区间右端点左侧的新区间,将首个区间替换成该区间。那么当我们无法替换时,首个区间就是所有可以选择的区间中右端点最小的那个区间。 因此我们将所有区间按照右端点从小到大进行排序,那么排完序之后的首个区间,就是我们选择的首个区间。

Q: 如果有多个区间的右端点都同样最小怎么办?

由于选择的是首个区间,因此在左侧不会有其它的区间,那么左端点在何处是不重要的,只要任意选择一个右端点最小的区间即可。

3.代码实现

3.1 动态规划

#写法1:超时
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        n = len(intervals)
        dp = [1] * n
        ans = 1
        # 按照右边界排序
        intervals.sort(key=lambda x: x[1])

        for i in range(n):
            for j in range(n - 1, -1, -1):
                # 只要第 j 个区间的右端点 r_j ≤ l_i
                if intervals[i][0] >= intervals[j][1]:
                    dp[i] = max(dp[i], dp[j] + 1)
                    break
            dp[i] = max(dp[i], dp[i - 1])
            ans = max(ans, dp[i])
        return n - ans

3.2 贪心

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        # 按照右边界排序
        intervals.sort(key=lambda x: x[1])
        n = len(intervals)
        # 上一个选择区间的右端点right	
        right = intervals[0][1]
        ans = 1

        for i in range(1, n):
            if intervals[i][0] >= right:
                ans += 1
                # 更新区间的右端点
                right = intervals[i][1]

        return n - ans

复杂度分析:

  • 时间复杂度:O(nlogn),其中 n是区间的数量。
  • 空间复杂度:O(logn),即为排序需要使用的栈空间。

相关文章:

  • Java-基于SSM的图书管理系统
  • P1271 【深基9.例1】选举学生会 题解
  • pacman 升级软件包提示 “failed to commit transaction (invalid or corrupted package)“
  • 大家都在“跪求”的Spring响应式微服务PDF蓝光版,简直羡慕了!
  • 屏蔽搜索引擎的无用蜘蛛,减轻服务器压力
  • 微信小程序开发开篇词 自顶向下,云端赋能:小程序的高效开发之道
  • Docker的常用命令
  • MySQL高级篇03【逻辑架构】
  • 云原生之容器编排实践-阿里云私有容器镜像仓库
  • 对二维数组从两个维度进行排序(Arrays.sort()方法使用Lambada表达式)
  • SpringBoot 接口整理
  • SpringBoot工程打包与发布运行
  • 芒格-“永远不要有受害者心态”
  • 【位运算】leetcode 190. 颠倒二进制位
  • nexus on k8s最佳实战
  • 《深入 React 技术栈》
  • ComponentOne 2017 V2版本正式发布
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • HTTP中GET与POST的区别 99%的错误认识
  • Java程序员幽默爆笑锦集
  • java取消线程实例
  • JS基础之数据类型、对象、原型、原型链、继承
  • Mac转Windows的拯救指南
  • Puppeteer:浏览器控制器
  • Spring Boot快速入门(一):Hello Spring Boot
  • 基于遗传算法的优化问题求解
  • 利用DataURL技术在网页上显示图片
  • 推荐一个React的管理后台框架
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 运行时添加log4j2的appender
  • ​​​​​​​​​​​​​​Γ函数
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (16)Reactor的测试——响应式Spring的道法术器
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)STM32单片机上位机
  • (9)目标检测_SSD的原理
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (libusb) usb口自动刷新
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (六)激光线扫描-三维重建
  • (论文阅读40-45)图像描述1
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • .Net 4.0并行库实用性演练
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 常见的偏门问题
  • .NET关于 跳过SSL中遇到的问题
  • .NET连接MongoDB数据库实例教程
  • ::什么意思
  • @我的前任是个极品 微博分析
  • [ Algorithm ] N次方算法 N Square 动态规划解决