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

贪心算法之重叠区间问题

以下四个题都是重叠区间问题

452. 用最少数量的箭引爆气球

  • 为了让气球尽可能重叠,先按照气球起始位置由大到小排序
  • tips:sort默认就可以实现以上排序,不需要写cmp
  • 重点:当下一个气球的左边界不小于上一个气球的右边界时(即有重叠的情况),为了判断再下一个气球能否和这两个有重叠,就需要将右边界 point[i][1] 置成小的那个右边界 min(point[i-1][1] , point[i][1])
class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(), points.end());int ret = 1;for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i - 1][1]) ret++;else points[i][1] = min(points[i - 1][1], points[i][1]);}return ret;}
};

435. 无重叠区间

与上一个题极其相似,首先按照左边界排序,当重叠的时候,舍弃重叠的右边长的那个区间(即将右边界定为小的那个),ret++记录重叠区间个数。

class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end());int ret = 0;for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] < intervals[i - 1][1]) {ret++;intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);}}return ret;}
};

763. 划分字母区间

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution {
public:vector<int> partitionLabels(string s) {int hash[27] = {0};for (int i = 0; i < s.size(); i++) {hash[s[i] - 'a'] = i;}vector<int> ret;int left = 0, right = 0;for (int i = 0; i < s.size(); i++) {right = max(hash[s[i] - 'a'], right);if (right == i) {ret.push_back(right - left + 1);left = i + 1;}}return ret;}
};

56. 合并区间

和上面的435差不多,先按照左边界排序好,将第一组数据添加到ret中,之后如果满足后一个的左边界小于等于这个的右边界时候,更新ret中的这个(ret.back()[1]更新成大的右边界),不满足就把下一个添加进来,for循环是从i=1开始

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end());if (intervals.size() == 1)return intervals;vector<vector<int>> ret;ret.push_back(intervals[0]);for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] <= ret.back()[1]) {ret.back()[1] = max(ret.back()[1], intervals[i][1]);} elseret.push_back(intervals[i]);}return ret;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux | 深入探究Linux进程控制:从fork到进程等待再到进程替换
  • 使用WINUI3 编写一个小软件1 C#
  • 如何更改select option边框颜色和选中的颜色
  • 鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导
  • 图像处理 -- 仿射变换之Affine Transformation
  • 多个条件同时查询时username和name无法被解析
  • git 配置SSH
  • 计算机网络:DNS、子网掩码、网关
  • 查找技术(4/6 改)
  • 【git】 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  • 低代码与AI:赋能企业数字化转型
  • WPF篇(20)- Menu菜单+ContextMenu上下文菜单+StatusBar状态栏
  • 《黑神话:悟空》媒体评分解禁 M站均分82
  • Qt:槽函数的响应和禁用
  • Nuclei文件上传小Tips
  • 【React系列】如何构建React应用程序
  • classpath对获取配置文件的影响
  • Elasticsearch 参考指南(升级前重新索引)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HTTP中GET与POST的区别 99%的错误认识
  • jdbc就是这么简单
  • Linux快速复制或删除大量小文件
  • mysql外键的使用
  • 分布式任务队列Celery
  • 基于 Babel 的 npm 包最小化设置
  • 简单数学运算程序(不定期更新)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 两列自适应布局方案整理
  • 排序算法之--选择排序
  • 深度学习在携程攻略社区的应用
  • 深入浅出webpack学习(1)--核心概念
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一天一个设计模式之JS实现——适配器模式
  • 译米田引理
  • Android开发者必备:推荐一款助力开发的开源APP
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​浅谈 Linux 中的 core dump 分析方法
  • ​数据结构之初始二叉树(3)
  • # Maven错误Error executing Maven
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #Java第九次作业--输入输出流和文件操作
  • #QT(一种朴素的计算器实现方法)
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (三)终结任务
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)React组件、useState、组件样式
  • (自用)网络编程
  • ../depcomp: line 571: exec: g++: not found
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Mobi域名介绍
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例