力扣第435题 无重叠区间 c++ 贪心思维

题目

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
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104

思路和解题方法

  1. 贪心算法的思维是选择右边界最小的区间,以便给后续的区间留下更多的空间,从而尽可能地避免重叠。
  2. 首先,我们将区间按照右边界进行排序,这样可以保证在遍历过程中,当前区间的左边界总是大于等于前一个区间的右边界。这样做的目的是为了确保我们尽量选择右边界较小的区间,以便给后续的区间留下更多的空间。
  3. 然后,我们从第一个区间开始遍历。我们初始化一个计数器 count,用于记录非交叉区间的个数,初始值为 1,因为至少有一个区间不会被移除。我们还维护一个变量 end,用于记录当前区间的右边界。
  4. 在遍历过程中,对于每个区间,我们检查它的左边界是否大于等于 end。如果是的话,说明当前区间与前一个区间不重叠,我们将 count 自增,并更新 end 为当前区间的右边界。这样做的目的是选择一个新的非交叉区间。
  5. 最后,我们返回移除的区间个数,即总区间个数减去非交叉区间的个数。
  6. 这种贪心策略的思想是通过选择右边界最小的区间来最大化剩余区间的空间,从而尽量避免重叠。虽然在每个步骤中我们只考虑了当前最优解,但通过按照右边界排序,我们可以确保得到的解是全局最优的。

复杂度

        时间复杂度:

                O(n*logn)

时间复杂度为O(nlogn),其中n是区间的数量。主要耗时的操作是对区间进行排序,时间复杂度为O(nlogn)。

遍历区间的过程需要线性时间,时间复杂度为O(n)。

O(nlogn)+O(n) = O(nlogn)

        空间复杂度

                O(1)

空间复杂度为O(1),除了存储输入和输出以外,代码没有使用额外的空间。

c++ 代码

class Solution {
public:// 按照区间右边界排序static bool cmp(const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0; // 如果区间为空,则不需要移除任何区间sort(intervals.begin(), intervals.end(), cmp); // 按照区间右边界排序int count = 1; // 记录非交叉区间的个数,初始化为 1,因为至少有一个区间不会被移除int end = intervals[0][1]; // 记录当前区间的右边界for (int i = 1; i < intervals.size(); i++) {if (end <= intervals[i][0]) {// 当前区间与前一个区间不重叠,更新 count 和 endend = intervals[i][1];count++;}}// 移除的区间个数等于总区间个数减去非交叉区间的个数return intervals.size() - count;}
};

思路二 (左排序,直接求答案)

不同之处

        首先,这个代码中的 cmp 函数将区间按照左边界进行排序,而不是右边界。这样做的目的是为了在遍历过程中更方便地判断重叠情况。具体来说,我们可以用一个变量 end 来记录当前区间的右边界,然后遍历每个区间,如果当前区间的左边界大于等于 end,说明当前区间与前一个区间不重叠,我们更新 end 为当前区间的右边界;否则,说明当前区间与前一个区间重叠,我们将 end 更新为两个区间右边界的最小值,并将计数器 count 自增。

        其次,这个代码中的计数器 count 是从 0 开始的,因为它记录的是重叠区间的个数,而不是非交叉区间的个数。这个细节不影响算法的正确性,只是需要注意计数器的初始值。

        最后,这个代码中的返回值是 count,而不是 intervals.size() - count。这个细节也不影响算法的正确性,只是需要注意返回值的含义。

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; // 按照左边界进行排序}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp); // 对区间按照左边界排序int count = 0; // 记录重叠区间的个数int end = intervals[0][1]; // 记录当前区间的右边界for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= end)  end = intervals[i][1]; // 无重叠的情况,更新右边界else { // 重叠情况end = min(end, intervals[i][1]); // 更新右边界为两个区间右边界的最小值count++; // 计数器自增,记录重叠区间的个数}}return count; // 返回重叠区间的个数}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的Pandas库(二)进阶使用

Python开发实用教程 DataFrame的运算 DataFrame重载了运算符&#xff0c;支持许多的运算 算术运算 运算方法运算说明df.add(other)对应元素的加&#xff0c;如果是标量&#xff0c;就每个元素加上标量df.radd(other)等效于otherdfdf.sub(other)对应元素相减&#xff0c;如果…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 &#xff08;1&#xff09;四元组的唯一性 &#xff08;2&#xff09;数据的传输过程 &#xff08;3&#xff09;NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 &#xff08;1&#xff09;游戏加…

图纸管理制度《四》

1、目的 使公司的图纸得到有效的控制&#xff0c;确保生产所用的图纸为最新有效版本&#xff0c;避免因图纸管理不当造成的损失。 2、定义 本制度所述的图纸包括产品总装图、装配图、零件图、工装图纸、检具图纸、包装图纸、工艺流程 3、范围 客户提供的图纸&#xff0c;技…

Kotlin 使用@BindingAdapter编译出错

在 Kotlin 中使用 BindingAdapter 注解时&#xff0c;需要确保你的项目正确配置了 Data Binding。 首先&#xff0c;请确保在项目的 build.gradle 文件中启用了 Data Binding&#xff1a; android {// ...dataBinding {enabled true} }接下来&#xff0c;请确保你在正确的地…

selenium+python web自动化测试框架项目实战实例教程

自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中&…

LabVIEW应用开发——基本函数(一)

前面我们介绍了一些控件的介绍和属性的配置&#xff0c;想要完成一个软件只会拖控件肯定是不行的&#xff0c;没办法实现既有的功能。比如我们要实现从串口中读到数据&#xff0c;根据一定的协议解析&#xff0c;然后转换成各个参数的值的显示&#xff0c;包括时间、电压、电流…

796. 子矩阵的和(左上角前缀和)

题目&#xff1a; 796. 子矩阵的和 - AcWing题库 思路&#xff1a; 1.暴力搜索&#xff08;搜索时间复杂度为O(n2)&#xff0c;很多时候会超时&#xff09; 2. 前缀和&#xff08;左上角前缀和&#xff09;&#xff1a;本题特殊在不是直接求前n个数的和&#xff0c;而是求…

第1篇 目标检测概述 —(3)目标检测评价指标

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标&#xff0c;主要包括几个指标&#xff1a;精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、交并比&#xff08;IoU&#xff09;、平均…

最后一个单词的长度[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个字符串s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s Hell…

UI自动化测试是什么?什么项目适合做UI自动化测试

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…

Flink Hive Catalog操作案例

在此对Flink读写Hive表操作进行逐步记录&#xff0c;需要指出的是&#xff0c;其中操作Hive分区表和非分区表的DDL有所不同&#xff0c;以下分别记录。 基础环境 Hive-3.1.3 Flink-1.17.1 基本操作与准备 1、上传依赖jar包到flink/lib目录下 cp flink-sql-connector-hive-…

【成功实现】CentOS磁盘扩容

对服务器磁盘扩容操作步骤 查看磁盘信息 fdisk -l 创建新分区 fdisk /dev/sda P n p … t 回车 8e w 重启虚拟机 reboot mkfs.ext4 /dev/sda4 查看磁盘信息 fdisk -l 创建物理卷 pvcreate /dev/sda4 y 创建卷组 并绑定物理卷 vgcreate centos /dev/sda4 创建逻辑…

golang小技巧

1/有时需要把json内容返回给前段进行文本编辑json字段&#xff0c;那么最好是能返回格式化后的json&#xff0c;这样对于用户编辑页方便。这时候可以利用json.MarshalIndent(data, "", "\t")来进行格式化&#xff0c;带有缩进的marshal。 2/对holders的填…

如何使用SpringBoot处理全局异常

如何使用SpringBoot处理全局异常 使用ControllerAdvice 和 ExceptionHandler处理全局异常 参考&#xff1a; ControllerAdvice ResponseBody Slf4j public class ExceptionHandler {ResponseStatus(HttpStatus.OK)org.springframework.web.bind.annotation.ExceptionHandler…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

Linux下的文件操作和文件管理

文章目录 应用编程文件操作文件描述符open函数write函数read函数close函数lseek函数文件操作例子 文件管理文件基本知识文件类型文件共享空洞文件错误处理退出程序原子操作fcntl和ioctl截断文件stat函数软链接和硬链接 应用编程 系统调用(system call)是Linux内核提供给应用层…

【ARM Coresight 系列文章 15.2 – components power domain 详细介绍】

【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1. Coresight 电源域模型1.1.1 CDBGPWRUPREQ 和 CDBGPWRUPACK1.1.2 CSYSPWRUPREQ 和 CSYSPWRUPACK1.1.3 Power Domain ID In RomTable1.1.4 Power domain entries1.1.5 Algorithm to discover power domain IDs1.1.6 De…

便利连锁:如何增加收益?教你一招轻松搞定!

自动售货机&#xff0c;作为零售行业的一项颠覆性技术&#xff0c;正逐渐改变着我们的购物方式和商业格局。这一创新技术不仅重新定义了零售业务模式&#xff0c;还为企业提供了更多的机会来满足不断演变的消费者需求。 客户案例 便利连锁店 成都某便利连锁店面临一系列挑战&am…

[Pytorch] 保存模型与加载模型

1、保存模型 # 定义模型 model BPNetModel(n_featuren_feature,n_hiddenn_hidden,n_outputn_output) #调用网络# 保存模型 torch.save(model, BPNetModel0.pth) 2、加载模型 import torch## 读取模型 model torch.load(BPNetModel0.pth) 3、保存模型参数 #调用网络 mode…

ASP.NET Core3.1 API 创建(Swagger配置、数据库连接Sql Server)、开发、部署

文章目录 创建项目点击Nuget安装包删除原有controllers编辑新建controll、添加注释Startup 注册Swagger服务使用swagger中间件配置XML注释更改启动端口 launchsettings.json在startup.cs跨域处理运行 数据库设计与连接安装库新建类继承框架根据数据库表设计对应设计类在DataCon…