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

贪心算法之合并区间

“任世界多宽广,停泊在这港口~” 


        区间问题,涉及到最多的就是 取交集 和 并集的概念。我们使用C++排序算法后,其默认规则就是按照 “左排序”进行的。因而,我们实质上注意的是每一个区间的 右端点,根据题目要求,总结规律,指定出策略解决问题。

合并区间

(1) 题目解析 

(2) 算法原理  

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end());vector<vector<int>> res;int n = intervals.size();// 取左右端点int left = intervals[0][0],right = intervals[0][1];for(int i=1;i<n;++i){int a = intervals[i][0],b = intervals[i][1];if(a <= right){// 有重合区间right = max(right,b);}else{// 更新res.push_back({left,right});left = a;right = b;}}// 最后一组 区间 也需要被插入res.push_back({left,right});return res;}
};

证明:

        因为,我们默认了排完序之后,所有的左端点,能合并的,都是连续的。所以,我们使用反证法设:左端点排完序后,不连续

        所以,我们按照左端点排完序后,一旦将区间合并,那么其一顶是连续的。

无重叠区间

(1) 题目解析

(2) 算法原理

class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end());int n = intervals.size();int ret = 0;int left = intervals[0][0],right = intervals[0][1];for(int i=1;i<n;++i){int a = intervals[i][0],b = intervals[i][1];if(a < right){// 存在重叠 保留小范围的ret++;right = min(right,b);}else{// 不存在重叠 新的开始right = b;}}return ret;}
};

证明:

        这样的贪心策略是否正确呢 ?我们假设贪心解是错误的。所以,我们会得到两份答案,一份是贪心解,一份是最有解:

⽤最少数量的箭引爆⽓球

(1) 题目解析

(2) 算法原理

 

class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(),points.end());int n = points.size();int left = points[0][0],right = points[0][1];int ret = 1; // 第一个区间就需要引爆for(int i=1;i<n;++i){int a = points[i][0],b = points[i][1];if(a <= right){// 重叠的 可以一支箭引爆right = min(right,b);}else{ret++; // 不是重叠 需要一支箭引爆right = b;}}return ret;}
};

        


本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

http://www.lryc.cn/news/302197.html

相关文章:

  • Eclipse - Colors and Fonts
  • java 数据结构LinkedList类
  • 第五次作业(防御安全)
  • 阿里云香港轻量应用服务器是什么线路?
  • C# Winform .net6自绘的圆形进度条
  • Git基本操作(超详细)
  • 【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能
  • Docker部署nginx
  • C++Qt——自定义信号与槽
  • 提高项目的性能和响应速度的方法
  • QT学习事件
  • 第13章 网络 Page818 UDP(和TCP的比较)
  • EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
  • 记录 | C++ cout.setf(ios::fixed)
  • Eclipse 创建 Hello World 工程
  • 【前端工程化面试题】vite热更新原理
  • 【leetcode】判断二叉树是否完全二叉树
  • Java多线程系列——内存模型JMM
  • 深入理解 Vue3 中的 setup 函数
  • 【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • java面试题:分布式和微服务的区别
  • GO语言的变量与常量
  • java面试多线程篇
  • Anaconda + VS Code 的安装与使用
  • Python爬虫html网址实战笔记
  • C++ 调用js 脚本
  • Vscode python pyside6 制作视频播放器
  • 纯前端低代码平台demo,vue框架,nodejs,简单的pm2纯前端部署实践
  • 致创新者:聚焦目标,而非问题
  • javaSE和javaEE区别