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

代码随想录训练营Day 38|力扣435. 无重叠区间、763.划分字母区间、56. 合并区间

1.无重叠区间

代码随想录

代码:(贪心算法)

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

 思路:

        这道题和我昨天做的用最少的箭引爆气球的题很像。都是按照左边界排序,然后去判断当前区间的左边界有没有小于前一个结点的有边界,如果有,就说明这两个区间重叠。当然也可能后续的很多区间都重叠了,因此,这里把当前区间的右边界赋值为min(当前区间的右边界,前一个区间的右边界),然后继续循环就好了。代码随想录训练营Day 37|力扣860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球-CSDN博客

        上一题问的是最少数量的箭,因此我们是把它初始化为1.然后在区间不重叠的时候++。 本题是求有多少给重叠区间,所以我们把它初始化为0,在区间重叠的时候++。

        (本题如果前后两个区间紧挨着——也就是前一个区间的右边界=当前区间的左边界,算作不重叠,我这里就错了

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;}// 找分界线——分界线的下标=当前遍历过的字母出现的最远下标int index = 0;int pre = 0;vector<int> result;for(int i = 0;i < s.size();i++){index = max(index,hash[s[i] - 'a']);if(i == index){result.push_back(index - pre + 1);pre = index + 1;}}return result;}
};

 思路:

具体步骤是什么? 

先把所有字母的最远下标映射到hash表里,然后再去找分界线——满足此时的下标 = 我们已经遍历过的所有字母的最远下标值。

这道题怎么体现贪心的思路的?

局部最优:尽可能少得控制划分区间的长度;全局最优:得到最多的区间数

有什么细节要注意?

这道题,我在边界问题上摔跟头了。我用pre来表示区间的左边界,index来表示区间的有边界——区间是左闭右闭的!!所以,我在收集完一个区间后,pre应该赋值为index+1!! 

3.合并区间

代码随想录

代码:(贪心算法)

class Solution {
public:static bool cmp(const vector<int>& a,const vector<int>& b){if(a[0] == b[0]) return a[1] < b[1];return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),cmp);vector<vector<int>> result;// 题上已经说了intervals最少有一个元素// result初始化result.push_back(intervals[0]);for(int i = 1;i < intervals.size();i++){if(result.back()[1] >= intervals[i][0]){ // 重叠区间时,在result里直接进行合并result.back()[1] = max(intervals[i][1],result.back()[1]);}else{result.push_back(intervals[i]); // 不重叠时,直接把当前的区间加入结果}}return result;}
};

 思路:

这道题也是求重叠区间,可是我感觉什么合并很复杂,合并后原来的数组下标是不是还要改变?

是的呢,所以,我直接对result里收集的数组进行融合操作。

这道题的重叠区间的判断,为什么不是取右边界的最小值了?

因为这道题要的是“合并”,两个区间重叠后合并,是要找它们的最大的边界范围的。而后续判断能否合并,则是看你“合并”后的上一个区间和现在你遍历的区间有没有重叠。 

相关文章:

  • docker实战之搭建MYSQL8.0主从同步
  • C++11function包装器的使用
  • 如何使用Java发送SOAP请求与webservice 服务进行通信
  • 如何搭建springBoot项目中的全局异常处理和自定义异常处理
  • golang通过go-aci适配神通数据库
  • 【全网最全】2024电工杯数学建模B题问题一14页论文+19建模过程代码+py代码+2种保奖思路+数据等(后续会更新成品论文等)
  • CCF-CSP认证 2024年3月 4.化学方程式配平
  • SpringBootWeb 篇-深入了解 Mybatis 概念、数据库连接池、环境配置和 Lombok 工具包
  • SQL、Mongo、Redis一般适用于那些场景
  • 【GO基础】1. Go语言环境搭建
  • Kafka之【生产消息】
  • 虹科案例丨VLAN不再难懂:一台转换器+交换机轻松解锁VLAN配置
  • VUE-watch和watchEffect的区别
  • 景源畅信数字:抖音小店新手该怎么做?
  • 修改MySQL root用户密码
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • EventListener原理
  • JavaScript设计模式与开发实践系列之策略模式
  • Java应用性能调优
  • miaov-React 最佳入门
  • PAT A1017 优先队列
  • Python3爬取英雄联盟英雄皮肤大图
  • ReactNativeweexDeviceOne对比
  • SpringBoot几种定时任务的实现方式
  • SSH 免密登录
  • Sublime text 3 3103 注册码
  • 分享几个不错的工具
  • 缓存与缓冲
  • 每天10道Java面试题,跟我走,offer有!
  • 面试遇到的一些题
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈web中前端模板引擎的使用
  • 山寨一个 Promise
  • 实战|智能家居行业移动应用性能分析
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用权重正则化较少模型过拟合
  • 手写双向链表LinkedList的几个常用功能
  • 思否第一天
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 小程序01:wepy框架整合iview webapp UI
  • 智能网联汽车信息安全
  • ​Linux·i2c驱动架构​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 安徽锐锋科技IDMS系统简介
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • ${factoryList }后面有空格不影响
  • (13)DroneCAN 适配器节点(一)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (六)激光线扫描-三维重建
  • (南京观海微电子)——I3C协议介绍
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...