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

【3.8】贪心算法-解无重叠区间

一、题目

        给定一个区间的集合 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. 按照区间的结束时间进行排序:这样可以确保我们优先选择结束时间早的区间,从而给后面的区间留下更多的空间。

  2. 遍历排序后的区间:从第二个区间开始,检查当前区间的开始时间是否与前一个区间的结束时间重叠。如果重叠,则需要移除当前区间(因为我们要尽量保留结束时间早的区间);如果不重叠,则保留当前区间。

  3. 记录移除的区间数量:在遍历过程中,记录需要移除的区间数量。

具体实现步骤如下:

  1. 将区间按照结束时间进行排序。

  2. 初始化一个变量 remove_count 用于记录移除的区间数量,初始化为 0。

  3. 初始化一个变量 prev_end 用于记录前一个区间的结束时间,初始化为第一个区间的结束时间。

  4. 从第二个区间开始遍历,如果当前区间的开始时间小于 prev_end,则说明当前区间与前一个区间重叠,需要移除,remove_count 加 1。

  5. 如果当前区间的开始时间大于或等于 prev_end,则说明当前区间与前一个区间不重叠,更新 prev_end 为当前区间的结束时间。

  6. 遍历结束后,返回 remove_count

三、代码实现

#include <iostream>
#include <vector>
#include <algorithm>// 比较函数,用于排序
bool compareIntervals(const std::vector<int>& a, const std::vector<int>& b) {return a[1] < b[1];
}int eraseOverlapIntervals(std::vector<std::vector<int>>& intervals) {if (intervals.empty()) {return 0;}// 按照结束时间进行排序std::sort(intervals.begin(), intervals.end(), compareIntervals);int remove_count = 0;int prev_end = intervals[0][1];for (size_t i = 1; i < intervals.size(); ++i) {if (intervals[i][0] < prev_end) {// 当前区间与前一个区间重叠,需要移除++remove_count;} else {// 当前区间与前一个区间不重叠,更新 prev_endprev_end = intervals[i][1];}}return remove_count;
}int main() {std::vector<std::vector<int>> intervals1 = {{1, 2}, {2, 3}, {3, 4}, {1, 3}};std::cout << "Example 1: " << eraseOverlapIntervals(intervals1) << std::endl; // 输出: 1return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微服务日常总结
  • GitLab 是什么?GitLab使用常见问题解答
  • Spring Boot实现文件上传和下载
  • 学生宿舍限电模块具体规格如何选择?
  • 线性代数 第三讲 线性相关无关 线性表示
  • 1、.Net UI框架:Avalonia UI - .Net宣传系列文章
  • 面试题总结(二) -- 面向对象篇(封装、继承、多态)
  • BaseCTF之web(week2)
  • [Linux] 操作系统 入门详解
  • element-ui单元格点击后进入编辑模式的功能
  • SpringBoot使用入门
  • 【安全漏洞】SpringBoot + SpringSecurity CORS跨域资源共享配置
  • Chrome 浏览器插件获取网页 window 对象(方案一)
  • Java 入门指南:Java NIO —— Buffer(缓冲区)
  • 【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2019年如何成为全栈工程师?
  • 30秒的PHP代码片段(1)数组 - Array
  • CentOS 7 修改主机名
  • HTML中设置input等文本框为不可操作
  • iOS 颜色设置看我就够了
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • mysql中InnoDB引擎中页的概念
  • 初识 webpack
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 开发基于以太坊智能合约的DApp
  • 入门到放弃node系列之Hello Word篇
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序--------语音识别(前端自己也能玩)
  • 小程序测试方案初探
  • 一天一个设计模式之JS实现——适配器模式
  • 优化 Vue 项目编译文件大小
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 追踪解析 FutureTask 源码
  • 仓管云——企业云erp功能有哪些?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • (done) 两个矩阵 “相似” 是什么意思?
  • (二)Linux——Linux常用指令
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (黑马点评)二、短信登录功能实现
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (六)c52学习之旅-独立按键
  • (四)opengl函数加载和错误处理
  • (算法)求1到1亿间的质数或素数
  • (转)fock函数详解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET CLR基本术语
  • .NET Core 项目指定SDK版本