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

无重叠区间

Alt
这道题按左边界排序和右边界排序都是可以的。主要就是要统计出不重合区间的数目。如果按照右区间排序,下面这张图十分形象:
Alt
这样去掉一组重叠区间后,剩下的那个区间它的右端点最小,能让后面产生尽量多的不重叠空间。
右区间排序写法:

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		return a[1] < b[1];
	}
public:
	int eraseOverlapIntervals(vector<vector<int>>& intervals){
		sort(intervals.begin(), intervals.end(), cmp);
		int count = 1;  //统计不重叠的区间数目,初始化为1,一定有一个不重叠的区间
		for(int i = 1; i < intervals.size(); i++){
			if(intervals[i][0] >= intervals[i - 1][1]){  // 出现了一个新的不重叠区间
				count++;
			}
			else  intervals[i][1] = intervals[i - 1][1];
		}
		return intervals.size() - count;
	}
};

左边界排序写法:

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		return a[0] < b[0];
	}
public:
	int eraseOverlapIntervals(vector<vector<int>>& intervals){
		sort(intervals.begin(), intervals.end(), cmp);
		int result = 0;
		for(int i = 1; i < intervals.size(); i++){
			if(intervals[i][0] < intervals[i - 1][1]){
				intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);
				// 其实效果和按右边界排序是一样的,只不过这里自己维护最小的右边界
				result++;
			}
		}
		return result;
	}
};

需要注意一个问题,如果是统计不重叠的区间,那就是从1计数,若是统计重叠的区间,则是从0开始计数

划分字母区间

Alt
相当于寻找每一个字母出现的边界,如果找到了之前所有出现字母的最远边界,说明这个边界就是一个分割点。
所以可以分为两步来处理:

  1. 找到每个字母出现的最远边界
  2. 重新遍历数组,更新遇到的字母出现的最远边界,如果当前遍历到下标与当前所有字母的最远边界相等,则找到了一个分割点。
class Solution{
public:
	vector<int> partitionLabels(string s) {
		int bound[26] = {0};
		for(int i = 0; i < s.size(); i++){
			bound[s[i] - 'a'] = i;  // 记录每个字母出现的最远位置下标
		}
		int left = 0, right = INT_MIN;
		vector<int> result;
		for(int i = 0; i < s.size(); i++){
			right = max(right, bound[s[i] - 'a']);  // 更新当前遇到的字母出现的最远位置
			if(i == right){
				result.push_back(right - left + 1);  // 当前到达的下标与最远边界相等,找到了一个分割点
				left = i + 1;
			}
		}
		return result;
	}
};

与前几道区间题类似的,这道题可以记录每个字母的起止区间,然后将重叠的区间进行合并,得到的不重叠的区间就是满足条件的,可以让区间内的字母只出现在区间内。

class Solution {
    static bool cmp(vector<int>& a, vector<int>& b){
        return a[0] < b[0];
    }
public:
    vector<vector<int>> computeBound(string s){
        vector<vector<int>> intervals(26, vector<int>(2, 0));
        for(int i = 0; i < s.length(); i++) {
            int index = s[i] - 'a';
            if(intervals[index][0] == 0){
                intervals[index][0] = i + 1;
            }
            intervals[index][1] = i + 1;
        }
        vector<vector<int>> filtered;
        for(int i = 0; i < intervals.size(); i++){
            if(intervals[i][0] != 0){
                filtered.push_back(intervals[i]);
            }
        }
        return filtered;
    }
    vector<int> partitionLabels(string s) {
        vector<vector<int>> intervals = computeBound(s);
        sort(intervals.begin(), intervals.end(), cmp);
        vector<int> result;
        for(int i = 1; i < intervals.size(); i++){
            if(intervals[i][0] > intervals[i - 1][1]){
                result.push_back(intervals[i - 1][1] - intervals[i - 1][0] + 1);
            }
            else{
                intervals[i][0] = intervals[i - 1][0];
                intervals[i][1] = max(intervals[i - 1][1], intervals[i][1]);
            }
            if(i == intervals.size() - 1){  
            	// 但要注意的是这种写法中,因为到末端以后没有更大的下标出现,从而记录末端区间,需要对末端单独处理
                result.push_back(intervals[i][1] - intervals[i][0] + 1);
            }
        }
        return result;
    }
};

合并区间

Alt
这道题与上一道题可以说一模一样了,要实现的就是合并区间,只不过这道题是要区间,上面那道是要区间长度。

class Solution{
	static bool cmp(vector<int>& a, vector<int>& b){
		return a[0] < b[0];
	}
public:
	vector<vector<int>> merge(vector<vector<int>>& intervals){
		sort(intervals.begin(), intervals.end(), cmp);
		result.push_back(intervals[0]);  // 后续如果有重叠,继续更新右边界
		for(int i = 0; i < intervals.size(); i++){
			if(intervals[i][0] <= result.back()[1]){  // 如果重叠,更新右边界最大值
				result.back()[1] = max(result.back()[1], intervals[i][1]);
			}
			else{
				result.push_back(intervals[i]);  // 不重叠,直接填入结果数组
			}
		}
		return result;
	}
};

或者我们也可以沿用上一道题的思路,同样是合并区间啦。

class Solution {
    static bool cmp(vector<int>& a, vector<int>& b) {
        return a[0] < b[0];
    }
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> result;
        for(int i = 1; i < intervals.size(); i++){
            if(intervals[i][0] <= intervals[i - 1][1]){
                intervals[i][0] = intervals[i - 1][0];
                intervals[i][1] = max(intervals[i][1], intervals[i - 1][1]);
            }
            else{
                result.push_back(intervals[i - 1]);  // 注意这里添加i - 1
            }
        }
        result.push_back(intervals[intervals.size() - 1]);  // 同样末端单独处理
        return result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用GPT写PHP框架

参考https://www.askchat.ai?r237422 写一个mvc框架 上面是简单的案例&#xff0c;完整的PHP框架&#xff0c;其核心通常包含以下几个关键组件&#xff1a; 1. 路由&#xff08;Routing&#xff09;&#xff1a;路由组件负责解析请求的URL&#xff0c;并将其映射到相应的控制…

MySQL原理(三)锁定机制(1)综述

一、介绍&#xff1a; 1、锁的本质 业务场景中存在共享资源&#xff0c;多个进程或线程需要竞争获取并处理共享资源&#xff0c;为了保证公平、可靠、结果正确等业务逻辑&#xff0c;要把并发执行的问题变为串行&#xff0c;串行时引入第三方锁当成谁有权限来操作共享资源的判…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 &#xff08;1&#xff09;规则序列 &#xff08;2&#xff09; 注入序列 4.触发源 5. 转换时间 &#xff08;1&#xff09; ADC时钟 &#xff08;2&#xff09; 采样时间 6. 数据寄存器 &am…

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中&#xff0c;数据作为一种关键的信息资源&#xff0c;其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体&#xff0c;承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排&#xff0c;同时快速输出加工图纸和数控加工代码。在壳体外购&#xff0c;没有柜体3D数据的情况下&#xff0c;如何轻松进行母排设计&#xff1f;一起来学习利驰数字母排的钣金功能吧&#xff01; SuperPanel的钣金…

通过实测,让你从书客、明基、好视力中选出最优质的护眼台灯

眼睛是我们与世界接触的最重要媒介之一&#xff0c;让我们能够观察到世间万物的美好。然而&#xff0c;由于种种原因&#xff0c;很多人都戴上了眼镜&#xff0c;这无疑在我们与世界的接触中增加了一层隔阂&#xff0c;给生活带来了诸多不便。为了缓解或避免近视的发生&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的d…

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】&#xff0c;后面验证了这样配置没办法产生预期的效果。 代码如下&#xff1a;void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

MyBatis 源码系列:MyBatis 解析配置文件、二级缓存、SQL

文章目录 解析全局配置文件二级缓存解析解析二级缓存缓存中的调用过程缓存中使用的设计模式 解析SQL 解析全局配置文件 启动流程分析 String resource "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 reader Resources.getResourceAsReader(re…

【3分钟开服】幻兽帕鲁服务器一键部署保姆教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 引用自&#x…

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里 要求&#xff1a;将172.20.26.74 中的test1、test2文件夹里的文件都同步到172.20.26.87机器上的t1文件夹里。 1、两台机器&#xff0c;关闭防火墙&#xff0c;能相互ping通&#xff0c;在172.20.26.87机器上将…

Windows编程入门-窗口控件-资源操作

window控件&#xff1a; 控件是常见的窗口上的交互元素例如&#xff1a;一个按钮&#xff0c;一个复选框&#xff0c;一个列表框等。 当控件的特定功能被触发后&#xff0c;会主动发送消息通知父窗口&#xff0c;父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…

Utreexo:优化Bitcoin UTXO集合的基于哈希的动态累加器

1. 引言 前序博客&#xff1a; Utreexo&#xff1a;比特币UTXO merkle tree proof以节约节点存储空间 MIT Digital Currency Initiative 的 Thaddeus Dryja 2019年论文 Utreexo: A dynamic hash-based accumulator optimized for the Bitcoin UTXO set。 开源代码实现见&…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

使用流服务器m7s对接gb28181

优&#xff1a;sip品牌兼容性比较好&#xff0c;大华&#xff0c;海康都稳定可以&#xff0c;srs的5.0 sip品牌兼容性大华没反应&#xff0c;akstream-sip 大华也有问题&#xff0c;wvp也还可以 缺&#xff1a;目前最新的4.7.4版本&#xff0c;&#xff0c;sip协议用udp正常&a…

年底特殊时期外贸装柜多花点心思

如果可以&#xff0c;尽量不要在工厂快要放假的时候安排装柜了&#xff0c;一个是人手不够&#xff0c;一个是容易漏货&#xff0c;还有就是柜子不好定。 看到有人说自己客户收到货的时候比预期晚了两个星期&#xff0c;一直延误&#xff0c;已经比原来要计划开业的时间推迟&a…

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务&#xff0c;直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader&#xff0c;是我们在目前 Spring 框架中对于服务功能测试的使用方式&#xff0c;它能很好的体现出 Spring 是如何对 xm…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统&#xff0c;完全依赖代码进行实现&#xff0c;动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标&#xff08;x,y&#xff09; //1秒时间内&#xff0c;移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能&#xff0c;用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置&#xff0c;然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import&#xff0c;将 Walrus file 提交给 Walrus server&#xff0c;由 …

Qt简易的五子棋

五子棋是个简单的小游戏&#xff0c;尝试使用Qt将他做出来&#xff0c;学习时的练习demo。 成果展示 需求分析 五子棋&#xff1a;在棋盘上&#xff0c;黑棋先行&#xff0c;交替下棋&#xff0c;五子练成直线获取胜利。 实现过程 1.棋盘绘制&#xff1a;下棋的第一步肯定是绘制…