代码随想录算法训练营第三十六天 | 435.无重叠区间、763.划分字母区间、56.合并区间

435.无重叠区间

题目链接:435.无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

文章讲解/视频讲解:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html

思路

贪心的思路如下图所示,首先按照右边界对区间进行排序。然后从左向右记录非交叉区间。

在这里插入图片描述

如上图,区间1、2、3重合,在移除时,需要移除区间2和区间3,保留右边界最小的区间1。因为非交叉
区间是按照右边界来判断的,只要一个区间的左边界小于一个非交叉区间的最小右边界,那么这个区间
就属于这个非交叉区间。上一句话的前提是这个区间和非交叉区间中的其他区间连续,例如,如果区间5
的左边界小于区间1的右边界,依然不能划入第一个非重合区间中。

反之,如果一个区间不属于这个非交叉区间,那么这个区间要么左边界大于等于这个非交叉区间的最小
右边界,要么这个区间在下一个非交叉区间中要被移除。对于第二种情况,设想一下区间5的左边界小于
区间1的右边界,区间5属于第二个非交叉区间,这时,因为区间5的右边界大于区间4的右边界,需要保
留的是区间4,区间5会被剔除。因此,我们可以放心地保留非交叉区间种右边界最小的区间(即非交叉
区间中的第一个区间),这个区间与后续的剔除后的区间一定不重叠。

如果是按照左边界对区间进行排序,那就需要从右往左记录非交叉区间了。

排序的时候,用数据的引用,而不是直接传形参。这样会快很多。

C++实现

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

763.划分字母区间

题目链接:763.划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

文章讲解/视频讲解:https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html

思路

第一遍遍历,用一个哈希表hash来记录下每个字母出现的次数。

第二遍遍历,每遍历一位字母,判断一下当前区间中的字母是否还剩余,比如对于字母a,用hash[‘a’]减
去已经遍历到的字母a的个数,如果等于0,说明所有字母a都已经遍历完了。如果对于当前区间中的所有
字母,都没有剩余了,那就可以进入下一个区间。

需要对tmpHash做一下clear操作。

也可以统计一下每一个字符最后出现的位置,然后在遍历的过程中,如果当前遍历到了当前区间内字符
中最后出现的位置,则找到了一个划分位置。

C++实现

// 原本写法
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> hashSet(26, 0);for(int i = 0;i<s.size();i++){hashSet[s[i] - 'a']++;}vector<int> results;vector<int> tmpHash(26, 0);for(int i = 0;i<s.size();i++){tmpHash[s[i] - 'a'] += 1;bool finished = true;int sum = 0;for(int j = 0;j<tmpHash.size();j++){if(tmpHash[j] != 0 && tmpHash[j] != hashSet[j]){finished = false;}sum += tmpHash[j];}if(finished){tmpHash.clear();tmpHash.resize(26, 0);results.push_back(sum);}}return results;}
};// 统计字符最后出现的位置
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> hashSet(26, 0);for(int i = 0;i<s.size();i++){hashSet[s[i] - 'a'] = i;}vector<int> results;int maxEnd = 0;int left = 0;for(int i = 0;i<s.size();i++){maxEnd = max(maxEnd, hashSet[s[i] - 'a']);if(maxEnd == i){results.push_back(i - left + 1);left = i + 1;}}return results;}
};

56. 合并区间

题目链接:56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

文章讲解/视频讲解:https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

思路

首先,对区间进行排序。如果有重叠区间,那么它们一定是连续的。

然后对每个区间进行遍历,每一次遍历的过程中,对区间取并集,如果当前区间不在之前的并集中,则
记录下并集区间,再开一个新的并集。与之前的无重叠区间相比,无重叠区间相当于在找交集。

C++实现

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {auto cmp = [](const vector<int>& a, const vector<int>& b){return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];};sort(intervals.begin(), intervals.end(), cmp);vector<vector<int>> results;int left = intervals[0][0];int maxRight = intervals[0][1];for(int i = 1;i<intervals.size();i++){if(intervals[i][0] <= maxRight){maxRight = max(maxRight, intervals[i][1]);}else{results.push_back({left, maxRight});left = intervals[i][0];maxRight = intervals[i][1];}}results.push_back({left, maxRight});return results;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间序列预测 — BiLSTM-Attention实现单变量负荷预测(Tensorflow)

专栏链接&#xff1a;https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 ​ 所有文章提供源代码、数据集、效果可视化 ​ 文章多次上领域内容榜、每日必看榜单、全站综合热榜 ​ ​ ​ ​ ​ ​ ​ 时间序列预测存在的问题 ​ 现有的大量方法没有真正的预测未…

日期处理第一篇:优雅好用的Java日期工具类Joda-Time

日常开发中&#xff0c;处理时间和日期是很常见的需求。基础的java内置工具类只有Date和Calendar&#xff0c;但是这些工具类的api使用并不是很方便和强大&#xff0c;于是就诞生了Joda-Time这个专门处理日期时间的库。 简介 Joda-Time提供了Java日期处理的优雅的替代品&…

Linux如何创建文件

使用touch命令&#xff1a;使用touch命令可以创建一个新文件&#xff0c;如果文件已经存在&#xff0c;则只更新其访问时间和修改时间。例如&#xff0c;要创建一个名为test.txt的文件&#xff0c;请在终端中输入以下命令&#xff1a; touch test.txt使用echo命令&#xff1a;使…

设计模式-简单工厂

设计模式-简单工厂 简单工厂模式是一个集中管理对象创建&#xff0c;并根据条件生成所需类型对象的设计模式&#xff0c;有助于提高代码的复用性和维护性&#xff0c;但可能会导致工厂类过于复杂且违反开闭原则。 抽象提取理论&#xff1a; 封装对象创建过程解耦客户端与产品…

Vue创建项目配置情况

刚开始接触vue项目创建和运行因为node版本和插件版本不一致时长遇到刚装好插件&#xff0c;项目就跑不起来的情况&#xff0c;特此记录一下 vue -V vue/cli 5.0.8 node -v v12.22.12 npm -v 6.14.16 关闭驼峰命名检查、未使用语法检查 package.json文件内容&#xff1a; {&…

Postgresql 12.2 + PostGIS 3.0.1 安装部署

参考文档&#xff1a; 按照该文档安装即可&#xff0c;如果遇到报错&#xff0c;可以参考下文&#xff1a; https://blog.csdn.net/weixin_41166785/article/details/127674169 所需的安装包 在资源里面&#xff08;我看下怎么可以不用积分下载&#xff09; 1、no acceptable…

大屏数据可视化的设计流程及原则

随着数字经济的快速发展和信息化在各行业各领域的深入推进&#xff0c;可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再只是电影里奇幻的画面&#xff0c;而是被实实在在地应用在政府、商业、金融、制造、交通、城市等各个行业的业务场景中&#xff0c;切切实实地实…

1739. 迷宫的所有路径-深度优先搜索-DFS

代码&#xff1a; #include<bits/stdc.h> using namespace std; int n; int fx[4]{0,1,0,-1}; int fy[4]{1,0,-1,0}; bool vis[100][100]; int q[35][3]; int c; void print(int k){c;cout<<c<<":";for(int i1;i<k;i){cout<<q[i][1]<…

python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)

目录 1、介绍 1.1、痛点 1.2、程序介绍 2、安装方式 2.1、&#x1f53a;必要环节 2.2、脚本安装 2.2.1、不太推荐的方式 2.2.2、节约内存的方式 2.3、⭐完整版安装 3、使用 3.1、最终文件目录 3.2、主程序 3.2.1、绝对路径 3.2.2、是否为书籍 3.2.3、⭐截取区域 …

训练DAMO-YOLO(damoyolo_tinynasL25_S.py)

文章目录 参考链接1 准备数据1.1 转为COCO格式1.2 指明数据路径 2 设置训练配置文件&#xff0c;在configs/damoyolo_tinynasL25_S.py进行如下两块修改2.1 关于训练参数的设置2.2 根据自己数据集设置 3 开始训练4 调用tools/eval.py进行测试5 训练时可能遇到的报错5.1 RuntimeE…

大师学SwiftUI第6章 - 声明式用户界面 Part 4

步进器视图 ​​Stepper​​视图创建一个带递增和递减按钮的控件。该结构体提供了多个初始化方法&#xff0c;包含不同的配置参数组合。以下是最常用的一部分。 Stepper(String, value: Binding, in: Range, step: Float, onEditingChanged: Closure)&#xff1a;此初始化方法…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…