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

435.无重叠区间

这题需要判断好两个点:

1、什么时候移除元素?(如何判断重叠?)——当前区间左边界小于之前区间右边界时移除元素

2、移除哪个元素?——移除右边界更靠后的元素

整体解题框架和昨天打气球差不多,也是先排序后处理好右边界

class cmp {
public:bool operator()(const vector<int>& v1, const vector<int>& v2) {if (v1[0] != v2[0])return v1[0] < v2[0];elsereturn v1[1] > v2[1];}
};int eraseOverlapIntervals(vector<vector<int>>& intervals) {std::sort(intervals.begin(), intervals.end(), cmp());int ans = 0;int right = intervals[0][1];for (int i = 1; i < intervals.size(); ++i) {if (intervals[i][0] < right) {// 如果发生重叠,删除右边界更大的那个(无论删除哪个,剩余的那个左边界都满足不重叠)right = std::min(right, intervals[i][1]);++ans;}else {right = intervals[i][1];}}return ans;
}

763.划分字母区间

这题自己的思路也是将其抽象为昨天打气球类似的框架,写出来虽然能AC但又抽象又繁琐,不是很美丽

大致思路:将每个字母都抽象为一个区间,区间记录其第一次与最后一次出现的位置。之后对这些区间进行排序,逐个将重叠的区间进行合并

(将所有字母抽象为区间后就和后面的56合并区间几乎完全一致了,仅有记录结果的方法不同)

class cmp {
public:bool operator()(const vector<int>& v1, const vector<int>& v2) {if (v1[0] != v2[0])return v1[0] < v2[0];elsereturn v1[1] > v2[1];}
};vector<int> partitionLabels(string s) {// 先统计各个字母出现的左右区间,将问题抽象为重叠区间问题vector<vector<int>> letters = { 26, vector<int>{-1, -1} };for (int i = 0; i < s.size(); ++i) {int ind = s[i] - 'a';if (letters[ind][0] == -1) {letters[ind][0] = i + 1;letters[ind][1] = i + 1;}else {letters[ind][1] = i + 1;}}// 删除没出现过的字母for (int i = 0; i < letters.size(); ) {if (letters[i][0] == -1)letters.erase(letters.begin() + i);else++i;}std::sort(letters.begin(), letters.end(), cmp());vector<int> ans;int right = letters[0][1];int sum = 0;		// sum记录之前已经完成分割的字符串长度for (int i = 1; i < letters.size(); ++i) {// 未重叠时分割字符串if (letters[i][0] >= right) {ans.push_back(right - sum);sum += ans.back();right = letters[i][1];}// 重叠时扩展当前分割的右边界else {right = std::max(right, letters[i][1]);}}if(sum != s.size())ans.push_back(s.size() - sum);return ans;
}

实际上只需要统计字母出现的右边界即可
整体思路有点类似于之前的跳跃游戏II:不断更新当前分割下所能到达的最远右边界,当到达右边界时更新结果

vector<int> partitionLabels(string s) {// 只统计每个字母的有边界int hash[27] = { 0 };for (int i = 0; i < s.size(); ++i)hash[s[i] - 'a'] = i;vector<int> ans;// 当前分割的左右边界int left = 0;int right = 0;for (int i = 0; i < s.size(); ++i) {// 不断扩张当前分割的右边界right = std::max(right, hash[s[i] - 'a']);// 如果到达当前分割的右边界,则保存当前分割结果if (i == right) {ans.push_back(right - left + 1);left = i + 1;right = i + 1;}}return ans;
}

56.合并区间

(按自己的思路写完上面的划分字母区间后再看这题甚至没看出区别)

整体思路与昨天的打气球类似:排序后逐个处理右边界。如果发生重叠则更新当前区间的右边界,如果没重叠则记录结果。

class cmp {
public:bool operator()(const vector<int>& v1, const vector<int>& v2) {if (v1[0] != v2[0])return v1[0] < v2[0];elsereturn v1[1] > v2[1];}
};vector<vector<int>> merge(vector<vector<int>>& intervals) {std::sort(intervals.begin(), intervals.end(), cmp());vector<vector<int>> ans;int left = intervals[0][0];int right = intervals[0][1];for (int i = 1; i < intervals.size(); ++i) {// 如果重叠则后推右边界(相当于进行了合并)if (intervals[i][0] <= right)right = std::max(right, intervals[i][1]);// 未重叠则记录区间else {ans.push_back({ left, right });left = intervals[i][0];right = intervals[i][1];}}ans.push_back({ left, right });return ans;
}

理解好了昨天的打气球今天的三道题思路其实都差不多(总算有几题能自己做出来了T^T)

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

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

相关文章

PHP如何实现动态代理IP

在网络爬虫、数据挖掘、网络安全等领域&#xff0c;动态代理IP的应用越来越广泛。动态代理IP可以帮助我们突破访问限制&#xff0c;保护真实IP地址&#xff0c;防止被封禁。 PHP是一种广泛应用于Web开发的流行服务器端脚本语言。那么&#xff0c;如何在PHP中实现动态代理IP呢&…

【架构】GPU虚拟化

GPU虚拟化方法 远程调用API 半虚拟化和全虚拟化 硬件划分 局限&#xff1a;授权付费 Hardware Partition&#xff1a;Ampere 架构的 A100 GPU 所支持的 MIG&#xff0c;即是一种 Hardware Partition。它的问题是不灵活: 只有高端 GPU 支持&#xff1b;只支持 CUDA 计算&#x…

基于springboot校园志愿者管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;校园志愿者管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;…

ROUGE-L和SPICE

ROUGE-L ROUGE-L&#xff08;Recall-Oriented Understudy for Gisting Evaluation - Longest Common Subsequence&#xff09;是一种用于评估自动文本摘要或机器翻译等自然语言处理任务的评价指标。它基于最长公共子序列&#xff08;LCS&#xff09;来计算&#xff0c;主要关注…

Linux下彻底卸载MySQL数据库

一、检查服务器是否已经安装了MySQL rpm -qa|grep mysql 如下所示 mysql-community-libs-compat-8.1.0-1.el7.x86_64 mysql-community-server-8.1.0-1.el7.x86_64 mysql-community-icu-data-files-8.1.0-1.el7.x86_64 mysql-community-common-8.1.0-1.el7.x86_64 php-mysqlnd-…

YOLOv8改进PIoU损失函数:PIoU v2损失增强了专注于中等质量锚盒的能力,v1版本使用非单调聚焦机制更直接、更快的边界框回归损失

💡本篇内容:YOLOv8改进PIoU损失函数:PIoU v2损失增强了专注于中等质量锚盒的能力,v1版本使用非单调聚焦机制更直接、更快的边界框回归损失 💡附改进源代码及教程,用来改进🚀PIoU损失函数 Powerful-IoU损失函数论文地址:https://www.sciencedirect.com/science/art…

C# 中的回调函数

引言 回调函数是一种在编程中常用的概念&#xff0c;它在 C# 中扮演着重要的角色。本文将介绍回调函数的概念、语法和应用&#xff0c;并讨论如何设计优化和重用回调函数&#xff0c;以及它们在并发编程中的用途。 1. 回调函数的概念与作用 回调函数是指将一个函数作为参数传…

设计模式学习笔记 - 面向对象 - 2.封装、抽象、继承、多态分别用来解决哪些问题?

1.封装 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口&#xff0c;授权外部仅能通过类提供的方法&#xff08;或者叫作函数&#xff09;来访问内部信息或数据。 下面这段代码是一个简化版的虚拟钱包的代码实现。在金融系统中&#xff0c;我们会给每个用户创…

电脑恢复删除数据的原理和方法

在恢复数据的时候&#xff0c;很多人都会问&#xff0c;为什么删除的数据还能恢复&#xff1f;本篇和大家一起了解下硬盘上数据的存储方式&#xff0c;文件被删除的时候具体发生了什么&#xff0c;帮助大家理解数据恢复的基本原理。最后还会分享一个好用的数据恢复工具并附上图…

垂起固定翼无人机基础知识,垂起固定翼无人机应用前景,垂起固定翼无人机优缺点分析

无人机定义与类型 无人机&#xff0c;也称为无人驾驶飞行器&#xff0c;是一种无需人工直接操作的航空器。根据其用途、设计及技术特点&#xff0c;可以分为多种类型。垂起固定翼无人机是其中的一种&#xff0c;它具有垂直起降的能力并采用固定翼设计以提高飞行效率和稳定性。…

Excel SUMPRODUCT函数用法(成绩求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…

解决flask结合layui前端框架模板(laytpl 语法)与gin语法出现冲突的问题。

在模板中加了laytpl的写法 例如&#xff1a; gin框架渲染数据的语法也是{{ }} 例如&#xff1a; 如何两者都出现在html模板页&#xff0c;运行gin框架会识别为框架定义的变量&#xff0c;运行之后发现报如上错误&#xff0c;出现了错误是因为刚好gin的写法也是"{{ 变量 }…

【JavaEE】_CSS选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

力扣:40. 组合总和 II

回溯&#xff1a; 1.先声明好大集合和小集合&#xff0c;在调用回溯函数&#xff0c;终止条件为sumtarget&#xff0c;要进行剪枝操作减少遍历的次数&#xff0c;去重操作防止数组中有两个相同的值来组成的集合相同。 class Solution {List<List<Integer>> li1ne…

Leetcode日记 290. 单词规律 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配

Leetcode日记 290. 单词规律 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配 解题思路制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。…

ChatGPT:你的数字生活助手

ChatGPT&#xff1a;你的数字生活助手 随着人工智能的飞速发展&#xff0c;AI写作技术成为了一个备受争议的话题。ChatGPT作为OpenAI开发的先进语言模型&#xff0c;不仅提供了对话和问题解答服务&#xff0c;还成为了提升日常工作和生活效率的强大工具。然而&#xff0c;许多…

WEB基础及http协议(Apache)

一、httpd安装组成 http服务基于C/S结构 1、常见http服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题nginx 解决C10K问题lighttpdIIS .asp 应用程序服务器tomcat .jsp 应用程序服务器jetty 开源的servlet容器&#xff0c;基于Java…

【Java代码审计】本地命令执行函数

1.本地命令执行函数 在服务器中时常会调用命令执行的代码&#xff0c;以完善或加强系统的功能需求&#xff0c;一旦这些调用命令执行的接口被攻击者恶意利用&#xff0c;就会导致服务器沦陷。 在Java中可用于执行系统命令的方式有API有&#xff1a;java.lang.Runtime、java.la…

基于微信小程序的比赛赛程管理系统设计与实现

在全面健身的倡导下通过各级赛事的举办完成体育人才的选拔&#xff0c;当由于缺乏信息化的管理手段而只能通过人工完成比赛报名、赛程制定及成绩记录等流程的管理&#xff0c;因此常常因意外而导致比赛赛程管理不善、成绩不理想等问题出现。为了帮助比赛组织者优化赛程管理流程…

最大加权矩阵(洛谷)

题目 原题 题目描述 为了更好的备战 NOIP2013&#xff0c;电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为&#xff0c;我们不光需要机房&#xff0c;我们还需要运动&#xff0c;于是就决定找校长申请一块电脑组的课余运动场地&#xff0c;听说她们都是电脑组的高手&#xff0c;校长没有…