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

代码随想录算法训练营 | 贪心算法 part04

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

452. 用最少数量的箭引爆气球
排序后数组points = [[1,10],[3,9],[4,11],[6,7],[6,9],[8,12],[9,12]]
在这里插入图片描述
局部最优:尽可能多的气球重合,计算完全重叠的区间,在重合区间内射箭,可以一箭射爆这些重叠的气球;
比如:[[1,10],[3,9],[4,11],[6,7],[6,9]] 的重合区间为[6,7];在这个区间内射箭可以一箭射爆全部气球;
全局最优:用最少的箭射爆全部气球;
注意:要求满足 Xstart ≤ X ≤ Xend,则该气球会被引爆;即[1,2],[2,3] 两只气球可以用同一支箭引爆;

class Solution {
public:static bool cmp (vector<int>& a, vector<int>& b) {// if (a[0] == b[0]) {//     return a[1] < b[1];// }return a[0] < b[0];}int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(), points.end(), cmp);int ans = 1;// 重合区间[start, end]int start = points[0][0];int end = points[0][1];for (int i = 1; i < points.size(); i++) {if (points[i][0] >= start && points[i][0] <= end) {if (points[i][1] <= end) {end = points[i][1];} start = points[i][0];} else if (points[i][0] > end) { // 区间不重合ans++;start = points[i][0];end = points[i][1];}}return ans;}
};

发现箭在边界也可以引爆气球,我们不需要维护一个重合区间,只要维护重合区间的右端点即可;因为右边界也是判断区间是否重合的关键;

for (int i = 1; i < points.size(); i++) {if (points[i][0] > end) { // 区间不重合ans++;end = points[i][1];}else if (points[i][1] < end) {end = points[i][1];}
}

右端点从小到大排序

class Solution {
public:static bool cmp (vector<int>& a, vector<int>& b) {return a[1] < b[1];}int findMinArrowShots(vector<vector<int>>& points) {// 右端点从小到大排序sort(points.begin(), points.end(), cmp);int ans = 1;int end = points[0][1];for (int i = 1; i < points.size(); i++) {if (points[i][0] > end) { // 区间不重合ans++;end = points[i][1];}}return ans;}
};

435. 无重叠区间

435. 无重叠区间
局部最优:在有重合的区间里找一个区间范围尽可能小的区间;
比如:[[1,10],[3,9],[4,11],[6,7],[6,9]] 的最小范围区间为[6,7];
全局最优:最少的移除区间个数;

class Solution {
public:static bool cmp(vector<int>& a, vector<int>& b) {if(a[0] == b[0]) {return a[1] < b[1];}return a[0] < b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), cmp);int ans = 0;// 在有重合的区间里找一个区间范围尽可能小的区间[start, end]int start = intervals[0][0];int end = intervals[0][1];for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= start && intervals[i][0] < end){if(intervals[i][1] <= end) {start = intervals[i][0];end = intervals[i][1];}ans++;} else if (intervals[i][0] >= end) {start = intervals[i][0];end = intervals[i][1];}}return ans;}
};

763. 划分字母区间

763. 划分字母区间
知道每一个字母出现的区间,合并重叠空间,计算合并后区间的大小;

class Solution {
public:vector<int> partitionLabels(string s) {vector<int> vec(26, 0); // 存储每个字母最后出现的下标for (int i = 0; i < s.size(); i++) {vec[s[i] - 'a'] = i;}vector<int> ans;int start = 0;int end = 0;for (int i = 0; i < s.size(); i++) {end = max(end, vec[s[i] - 'a']); // 更新字符出现的最远边界if (end == i) { // 当前区间合并完毕ans.push_back(end - start + 1); // 区间长度加入答案start = i + 1; // 下一个区间的左端点}}return ans;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 提升家居品质,从一颗螺丝开始:深度解析定制螺丝服务
  • 使用Nvm切换nodeJs高版本之后,使用npm install一闪而过
  • 分班查询一键发布,老师们都在用
  • linux下路由追踪traceroute命令详解
  • 杂项复现-中间件
  • ElasticSearch聚合操作详解
  • Android RadioGroup实现多行显示,并保持单选
  • java中RSA分段加解密及Data must not be longer than异常处理
  • 【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(一)
  • JAVA毕业设计635—基于Java+ssm的仓库管理系统(源代码+数据库)
  • 图解Kafka | 彻底弄明白 Kafka 两个最重要的配置
  • NTP时钟同步服务器_ntp时间服务器-京准
  • 简介反向代理作用
  • 基于STM32开发的智能门铃系统
  • “tcp控制协议”的理解
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【个人向】《HTTP图解》阅后小结
  • AngularJS指令开发(1)——参数详解
  • es6(二):字符串的扩展
  • iOS 系统授权开发
  • markdown编辑器简评
  • Promise面试题,控制异步流程
  • Sass Day-01
  • 从零开始的无人驾驶 1
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 力扣(LeetCode)965
  • 模型微调
  • 一些css基础学习笔记
  • 自定义函数
  • Java总结 - String - 这篇请使劲喷我
  • k8s使用glusterfs实现动态持久化存储
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #define,static,const,三种常量的区别
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $.ajax()方法详解
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (39)STM32——FLASH闪存
  • (7) cmake 编译C++程序(二)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (黑马点评)二、短信登录功能实现
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (五)MySQL的备份及恢复
  • (五)关系数据库标准语言SQL
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)