Leetcode(435)——无重叠区间

DAY39:贪心算法(八)无重叠区间+划分字母区间+合并区间 这道题目leetcode标记为贪心算法,其实没有太体现贪心策略,找不出局部最优推出全局最优的过程。本质上还是重叠区间的问题,就是用最远出现距离模拟了圈字符的行为。最远出现距离,相当于重叠区间中包含所有区间的最大区间。关于重叠区间类型的题目,其实主要就是靠画图模拟。重叠区间题目需要注意元素初值的问题,包括计数变量的初值,以及有时候需要考虑数组i=0时候的初值(因为重叠判断大都是i=1开始的)。比如本题,是结果收集而不是记录重叠个数,此时就需要考虑数组初值也要被加入结果数组的情况! 阅读详情

Leetcode(435)——无重叠区间

题目

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 111 <= intervals.length <= 10510^5105
  • intervals[i].length == 222
  • −5∗104-5 * 10^4−5∗104 <= starti < endi <= 5∗1045 * 10^45∗104

题解

方法一:贪心算法

思路

​​  我们不妨想一想应该选择哪一个区间作为首个区间。

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

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

​​  在选择首个区间时,如果有多个区间的右端点都同样最小怎么办? 由于我们选择的是首个区间,因此在它的左侧不会有其它的区间,那么左端点在何处是不重要的,我们只要任意选择一个右端点最小的区间即可。

​​  当确定了首个区间之后,所有与首个区间不重合的区间就组成了一个规模更小的子问题。由于我们已经在初始时将所有区间按照右端点排好序了,因此对于这个子问题,我们无需再次进行排序,只要找出其中与首个区间不重合并且右端点最小的区间即可。用相同的方法,我们可以依次确定后续的所有区间。

​​  在实际的代码编写中,我们对按照右端点排好序的区间进行遍历,并且实时维护上一个选择区间的右端点 right\textit{right}right。如果当前遍历到的区间 [li,ri][l_i, r_i][li​,ri​] 与上一个区间不重合,即 li≥rightl_i \geq \textit{right}li​≥right,那么我们就可以贪心地选择这个区间,并将 right\textit{right}right 更新为 rir_iri​。

代码实现
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.empty()) return 0;
        int n = intervals.size();
        sort(intervals.begin(), intervals.end(), 
            [](vector<int>& a, vector<int>& b){return a[1] < b[1];});
        int total = 0, prev = intervals[0][1];
        for(int i = 1; i < n; ++i) {
            if(intervals[i][0] < prev) ++total;
            else prev = intervals[i][1];
        }
        return total;
    }
};
复杂度分析

时间复杂度:O(nlog⁡n)O(n \log n)O(nlogn),其中 nnn 是区间的数量。我们需要 O(nlog⁡n)O(n \log n)O(nlogn) 的时间对所有的区间按照右端点进行升序排序,并且需要 O(n)O(n)O(n) 的时间进行遍历。由于前者在渐进意义下大于后者,因此总时间复杂度为 O(nlog⁡n)O(n \log n)O(nlogn)。
空间复杂度:O(logn)O(logn)O(logn),即为排序需要使用的栈空间。

方法二:动态规划

思路

​​  因为题目的要求等价于「选出最多数量的区间,使得它们互不重叠」。由于选出的区间互不重叠,因此我们可以将它们按照端点从小到大的顺序进行排序,并且无论我们按照左端点还是右端点进行排序,得到的结果都是唯一的。
​​  这样一来,我们可以先将所有的 nnn 个区间按照左端点(或者右端点)从小到大进行排序,随后使用动态规划的方法求出区间数量的最大值。设排完序后这 nnn 个区间的左右端点分别为 l0,⋯ ,ln−1l_0, \cdots, l_{n-1}l0​,⋯,ln−1​ 以及 r0,⋯ ,rn−1r_0, \cdots, r_{n-1}r0​,⋯,rn−1​,那么我们令 fif_ifi​ 表示「从区间 000 到区间 iii 的这些区间中,在最后一个区间为 iii 的情况下,可以选出最多的无重叠的区间的数量」,状态转移方程即为:
fi=max⁡j<i ∧ rj≤li{fj}+1 f_i = \max_{j < i ~\wedge~ r_j \leq l_i} \{ f_j \} + 1 fi​=j<i ∧ rj​≤li​max​{fj​}+1

​​  即我们枚举倒数第二个区间的编号 jjj,满足 j<ij < ij<i,并且第 jjj 个区间必须要与第 iii 个区间不重叠。由于我们已经按照左端点进行升序排序了,因此只要第 jjj 个区间的右端点 rjr_jrj​ 没有越过第 iii 个区间的左端点 lil_ili​,即 rj≤lir_j \leq l_irj​≤li​,那么第 jjj 个区间就与第 iii 个区间不重叠。我们在所有满足要求的 jjj 中,选择 fjf_jfj​ 最大的那一个进行状态转移,如果找不到满足要求的区间,那么状态转移方程中 max⁡\maxmax 这一项就为 000,fif_ifi​ 就为 111。
​​  最终的答案即为所有 fif_ifi​ 中的最大值。

代码实现
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.empty()) {
            return 0;
        }
        
        sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
            return u[0] < v[0];
        });

        int n = intervals.size();
        vector<int> f(n, 1);
        for (int i = 1; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (intervals[j][1] <= intervals[i][0]) {
                    f[i] = max(f[i], f[j] + 1);
                }
            }
        }
        return n - *max_element(f.begin(), f.end());
    }
};
复杂度分析

时间复杂度:O(n2)O(n^2)O(n2),其中 nnn 是区间的数量。我们需要 O(nlog⁡n)O(n \log n)O(nlogn) 的时间对所有的区间按照左端点进行升序排序,并且需要 O(n2)O(n^2)O(n2) 的时间进行动态规划。由于前者在渐进意义下小于后者,因此总时间复杂度为 O(n2)O(n^2)O(n2)。
注意到方法二本质上是一个「最长上升子序列」问题,因此我们可以将时间复杂度优化至 O(nlog⁡n)O(n \log n)O(nlogn),具体可以参考「300. 最长递增子序列的官方题解」。
空间复杂度:O(n)O(n)O(n),即为存储所有状态 fif_ifi​ 需要的空间。

Leetcode 435. 无重叠区间——Java解题思路解析 Leetcode 435. 无重叠区间——Java解题思路解析 本题是使用了贪心算法,结合Arrays.sort的重载方法 文章目录Leetcode 435. 无重叠区间——Java解题思路解析一、题目描述二、思路1. 贪心算法2. 动态规划总结 一、题目描述 题目描述 给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。 输入输出样例 输入是一个数组,数组由多个长度固定为 2 的数组组成,表示区间的开始和结尾。输出一个整数,表示需要移除的区间数量。 Input: [[1,2 阅读详情

相关推荐

【算法-贪心】无重叠区间-力扣 435 题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

最大不重叠区间

http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=1126 RT,给定n个区间,每个区间有开始时间si和结束时间ei, 问在数轴上如何摆放能使在没有重叠区间的情况下区间数目达到最大? 分析:典型的贪心思路,在《算法导论》贪心那一章的第一个例子即是它——活动选择问题 解法:按区间的结束时间从小到大排序后,从小

messiandzcy的专栏 3050

ESP32+LED12864液晶屏实战:手把手教你显示中文与自定义图标(附完整代码)

本文详细介绍了如何使用ESP32单片机驱动带字库的LED12864液晶屏,实现中文显示与自定义图标。从硬件选型、接线方案到驱动编写、字库解析,提供了完整的实战代码与优化技巧,并最终构建了一个智能家居控制面板的完整示例项目。

weixin_29212867的博客 144

LeetCode: 435.无重叠区间

题目:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 这道题和合并区间有点类似。但合并区间要求求出合并之后的区间集合。这道题是要你删除最小数量的一些区间,使得剩下的区间不重合。 解法 暴力:我们当然可以遍历所有不重叠的区间组合,然后用删除前总集合数目-剩下的区间数目,就是删除的数目。取最小就行了(超时) 动态规划(超时)。我们先对每个集合的第一个地址排序(一般涉及区间都是先按第一个元素或者第二个元素排序)。dp[i]记录前i个区间使之不重叠的最小删除区间数目。 class

我的博客有点东西 588

红外热成像仪原理及应用

目录什么是红外热成像背景介绍热成像技术原理热成像分类红外热成像和夜视仪之间的区别红外热像仪夜视仪红外照明相机对比红外热像仪都能看透什么如何选择制冷型和非制冷型红外热像仪制冷型红外热像仪非制冷型红外热像仪实例对比成像速度空间分辨率灵敏度光谱滤波同步何如选择合适的红外热像仪像素测温范围和被测物温度分辨率空间分辨率温度稳定性热像仪的距离系数比常见热成像仪关键参数量程视场角 (FOV)红外分辨率热灵敏度(NETD)焦距光谱范围精度内置优化分析NTED(热灵敏度)什么是NETD如何测量NETD?NETD如何影响测量?

zhy295006359的博客 2万+

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 344

C++每日一练16-插入区间

插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 整体思路: 遍历每一个区间,满足条件的小区间的左边界作为插入后区间的左边界,然后判断插入区间的右边界将置为何值。 利用穷举法,将会出现的各种情况都做出解决。代码很乱,而且用了非常多的选择语句,就是对应着每一种会出现的情况所设置. 代码: class Solution { public: vector<vector<int&g

holyOOOshit的博客 357

谷歌学术用publish-or-perish来对引用量排序

用谷歌学术搜索文献的时候发现不能按照引用量高低进行排序,网上提供了这个软件。 下载地址如下:Publish or Perish (harzing.com)https://harzing.com/resources/publish-or-perish 关于软件界面页面和各种指标的介绍,可以参考中科大的这个PPT: 文献分析软件——publish or perish(精品·公开课件).ppt (book118.com)https://max.book118.com/html/2018/1124/813

m0_48878989的博客 1万+

无重叠区间

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: [ [1,2], [1,2], [...

weixin_41791402的博客 608

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5463

基于Dify1.9知识库流水线模板的思考——图像和表格数据处理

本文探讨了Dify1.9知识库流水线中LLM节点对文档图像/表格增强处理的优化方案。针对当前仅在内容后追加说明的简单做法,提出了结构化标注的改进方法:通过唯一ID和注释块标记图像/表格及其描述,确保内容可精准对齐。文章详细阐述了该方案的解析处理流程、数据结构化表示方法,以及在RAG检索和文档还原中的具体应用。关键经验包括:必须结构化标注非文本内容、LLM增强的必要性、语义向量化处理等。该方案解决了原始方法在内容重排、相似元素区分和检索精度等方面的问题。

roseey的专栏 1430

力扣Leetcode之Java解题435无重叠区间

力扣java解题435无重叠区间

小李子Lee 495

【32】OpenCV——图像含义关系?RGGB , BGGR , GRBG , GBRG呢?raw8,raw10,raw12,raw14呢? YUV422; RAW16呢?YCbYCr/RG_GB;

‌如前所述,定义原始数据的位深精度。‌* ‌一种压缩色彩编码方式,通过色度抽样(亮度Y全分辨率,色度U/V半分辨率)减少数据量,常用于视频传输。‌* ‌可能指每个像素分量占16位存储(如高位填充的RAW10/12/14),或未明确量化的高精度原始数据。‌ ‌分类‌核心定义‌关联性及典型应用传感器原始色彩排列(RGGB/BGGR等)决定RAW数据的色彩分布规则RAW位深每个分量的数据精度(8/10/12/14位)影响动态范围和存储空间‌YUV422。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 790

435. 无重叠区间(力扣LeetCode)

策略是保留结束位置较小的区间,因为这样做可以为后面的区间留出尽可能多的空间,从而减少整体的重叠数量。:如果当前区间的起始位置大于或等于前一个区间的结束位置,则这两个区间不重叠,无需移除。:首先,按照区间的起始位置对所有区间进行排序,使得比较和处理区间时有一个确定的顺序。输入: intervals = [[1,2],[2,3],[3,4],[1,3]]输入: intervals = [ [1,2], [1,2], [1,2] ]输入: intervals = [ [1,2], [2,3] ]

m0_73841621的博客 829

Coze智能体开发:工作流教程之解析文件概述

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 1792

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【练习】【贪心】力扣435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。例如 [1, 2] 和 [2, 3] 是不重叠的。输入: intervals = [[1,2],[2,3],[3,4],[1,3]]输入: intervals = [ [1,2], [1,2], [1,2] ]输入: intervals = [ [1,2], [2,3] ]解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。解释: 移除 [1,3] 后,剩下的区间没有重叠。

2402_86344613的博客 369

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Leetcode-435:无重叠区间

题目链接 Leetcode-435:无重叠区间 题目描述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间...

康雨城 638

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Leetcode 435. 无重叠区间 C++

Leetcode 435. 无重叠区间 题目 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 测试样例 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1

weixin_43750513的博客 525

LeetCode435无重叠区间题解

LeetCode 435 无重叠区间题解

weixin_54231095的博客 119

力扣每日一题:435. 无重叠区间

435. 无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重

gtjsjj的博客 609

力扣435-无重叠区间(Java详细题解)

其实这题你如果做过力扣452-用最少数量的箭引爆气球或者看过我的这那篇题解的话,那么就会感觉这题跟那题很像。其实这道题与我上面说的那道题很像,甚至只要对那道题的代码稍加改造,就能AC了。我们判断当前区间与上一个区间重叠时,我们还应该判断与下一个区间是否重叠。那么不重叠的区域考虑完后,我们是不是就要考虑重叠的区域。重叠区域的方式有很多种,我们可以先处理不重叠的部分。其实不用,这样代码更复杂,而且时间复杂度也会更差。if判断不重叠,那么else的就是重叠的部分了。因为你重叠的都删了,剩下的就都是不重叠的。

2302_79761426的博客 537

Leetcode 435 无重叠区间

Leetcode 435 无重叠区间 问题重述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有

UPC YR的博客 259

【leetcode】435. 无重叠区间

🚅【leetcode】435. 无重叠区间🚀题目💥leetcode代码模板🚀思路💻代码 🚀题目 leetcode原题链接 给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: intervals = [ [1,

laplacepoisson的博客 614

Leetcode 435. 无重叠区间

一模一样,区别是这个题是找重复区间,那个题是找不重复区间,那么直接相减就可以了。

JehanRio's Private Blog 226

leetcode-435:无重叠区间

leetcode-435:无重叠区间题目解题方法一:贪心 题目 题目链接 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你

菊头蝙蝠的博客 348

LeetCode435 无重叠区间

对于这道题,首先是要排序然后在确定是否有重叠,因此解题目标就是确定是按照左边界排序还是按照右边界排序。3.读入新的区间,判断新读入的区间左边界是否合格,合格则更新合格区间数,并且更新右边界end。然后这道题的思路就类似于Leetcode 55 【跳跃问题】了,使用贪心算法即可求解。2.设定右边界end和合格区间数unOverd。这里选择按照右边界排序,也就是代码中的。5.返回区间集合数 - 合格区间数。4.循环直到区间集合读取结束。

qq_41460537的博客 397
上一篇: Leetcode(135)——分发糖果
下一篇: Leetcode(605)——种花问题
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值