Studying-代码随想录训练营day30| 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间

第30天,贪心part04,加油,编程语言:C++

目录

452.用最少数量的箭引爆气球

435.无重叠区间 

763.划分字母区间 

总结 


452.用最少数量的箭引爆气球

文档讲解:代码随想录用最少数量的箭引爆气球

视频讲解:手撕用最少数量的箭引爆气球

题目:

学习:根据题干,很直观的贪心逻辑就是尽可能一箭射掉多的区间重叠的气球,最后得到最少数量的箭。因此本题的关键在于求解合适的重叠区间。

本题不需要模拟气球射爆把元素移除的过程,因为本题只需要计算最小的射箭数,因此我们只需要使用一个整型变量result,来手机合适出箭的重叠区间即可。

显然为了让气球尽可能的重叠,我们可以先对数组进行排序。按照起始位置或者按照终止位置排序都行,这里我们假设按照起始位置进行排序,以示例1为例:

排序后,我们可以看到,如果气球重叠了,重叠气球中右边边界的最小值之前的区间一定需要一个弓箭。这里一定要注意一定是右边边界的最小值,因为我们在遍历过程中,会发现气球3的起始点是在气球2的区间内的,但是依照上图显然我们是不能同时射爆气球1,2,3的,因此我们更新右边界的逻辑一定要注意是更新最小值。

代码:

//时间复杂度O(nlogn)快速排序的复杂度
//空间复杂度O(1)
class Solution {
public:static bool camp(vector<int>& a, vector<int>& b) {return a[0] < b[0];}int findMinArrowShots(vector<vector<int>>& points) {if(points.size() == 1) return 1;//对数组points咱找起始坐标从小到大进行排序sort(points.begin(), points.end(), camp);//贪心逻辑尽可能找重合的气球射int end = points[0][1]; //初始化,记录第一个气球的右边界int result = 1; //默认第一个气球要射出一根for(int i = 1; i < points.size(); i++) {if(points[i][0] <= end) {if(points[i][1] < end) {end = points[i][1]; //更新右边界,取重合最小的,这样才能保证射重复的气球}}else {result++;end = points[i][1];}}return result;    }
};

435.无重叠区间 

文档讲解:代码随想录无重叠区间

视频讲解:手撕无重叠区间

题目:

学习:本题实际上和上题是差不多的,甚至可以说是一样的。本题也是需要找重叠的区间。对于上一题来说射箭的数量,其实就是非重叠区间的数量,因此将区间总数减去射箭的数量,就是需要移除区间的数量。(但要注意,两道题的边界条件是不同的,对于本题来说区间相邻是不算重叠的,但是上题区间相邻是算重叠的,因此需要变一下边界条件)

代码:注意本题直接使用intervals[i][1]代替end变量

//时间复杂度O(nlogn)
//空间复杂度O(1)
class Solution {
public:// 按照区间左边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; // 左边界排序}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int result = 1; // points 不为空至少需要一支箭for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= intervals[i - 1][1]) {result++; // 需要一支箭}else {  // 气球i和气球i-1挨着intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); // 更新重叠气球最小右边界}}return intervals.size() - result;}
};

当然本题也可以正向去记录要删除的区间,这里我们采用按终点排序的方式,同样要注意分割点是 重合的最小右边界。

代码:

//时间复杂度O(nlogn)
//空间复杂度O(1)实际是O(n),因为快排存在递归调用,需要开辟栈区间
class Solution {
public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int count = 1; // 记录非交叉区间的个数int end = intervals[0][1]; // 记录区间分割点for (int i = 1; i < intervals.size(); i++) {if (end <= intervals[i][0]) {end = intervals[i][1];count++;}}return intervals.size() - count;}
};

763.划分字母区间 

文档讲解:代码随想录划分字母区间

视频讲解:手撕划分字母区间

题目:

学习: 本题同样也需要划分空间,但我认为本题比上面两题更难,因为本题不能够排序,也没有什么划分规律,因此难以下手。

本题的关键在于需要从全局的角度去划分数组,是无法通过一次遍历就把区间找出的。依据本题的要求,我们在遍历过程中,不仅要关注当前遍历的字母,还需要关注字符串后面有没有该字母,并且遍历的过程中还在不断的加入新的字母,因此一次遍历是得不到答案的。

但是我们也可以发现,如果我们知道了每个字母最后出现的位置,实际上本题就能够很容易解出来了,就是在遍历过程中,如果找到了之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。也即后面的字母肯定不存在于前面的字符串中。因此本题我们可以使用两个for循环,分为两步解决本题:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

代码:根据以上步骤,便可写出代码。

注意:当我们需要记录元素对应的下标时,我们很容易想到使用哈希表,但哈希表的种类有很多,我们解题的过程中,一定要从简单到复杂(数组->set->map)去思考使用哪种哈希表。对于本题来说我们可以采用map结构来保存元素和其对应的下标,但显然本题明确了字符串s仅由小写字母构成,元素数量有限,并且元素之间是具备连续关系的,因此本题使用数组来作为哈希表是更方便,更简单的。

//时间复杂度O(n)
//空间复杂度O(1)
class Solution {
public:vector<int> partitionLabels(string s) {int hash[26] = {0}; //使用数组作为哈希表vector<int> result; //记录答案//第一个循环,统计每一个字符最后出现的位置for(int i = 0; i < s.size(); i++) {hash[s[i] - 'a'] = i; //不断更新每个字母对应的最远下标}int left = 0; //左边界int right = 0; //右边界//第二个循环,找到分割点for(int i = 0; i < s.size(); i++) {right = max(right, hash[s[i] - 'a']); //不断更新最远右边界if(i == right) { //当i等于right的时候,就说明此时遍历的位置,就是前面所有字母的最远右边界,该位置就是一个分割点result.push_back(right - left + 1);left = i + 1; //计算下一个分割点}}return result;}
};

总结 

上述题目都属于是重叠区间类问题,这类问题贪心逻辑主要在于如何找到合适的重叠区间,每道题根据要求都有不同的模拟方法,因此需要多加练习。

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

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

相关文章

费马点猜想,求解,如何用java编写?

“费马点”是指位于三角形内且到三角形三个顶点距离之和最短的点。这个点与三角形三顶点连线构成的三个钝角都相等且为 120。注意&#xff0c;这不是“费马大定理”。 package com.ai157.aigc.controller.test; import javafx.application.Application; import javafx.scene.G…

一站式天气预报解决方案,API接口轻松接入

天气对我们的日常生活有着重要的影响&#xff0c;无论是出门旅行还是安排工作&#xff0c;都需要提前了解天气情况。WAPI平台提供了一站式天气预报解决方案&#xff0c;通过简单的API接口&#xff0c;轻松获取各类天气预报数据。 这个API接口提供了丰富的天气预报信息&#xf…

AI Agent技术的最新进展与改变世界的典型项目巡礼

AI Agent 探索 1. AI Agent 技术发展以及典型项目 1.0 前 AI Agent 时代 在学术探索的浩瀚星空中&#xff0c;机器人技术领域的璀璨明珠莫过于Agent技术的深入研究&#xff0c;这一领域历来是创新与突破的温床。回溯至大模型浪潮兴起之前&#xff0c;Agent技术的辉煌篇章便已…

7月强化|跟武忠祥,写严选题还是880题

严选题和武老师的高数强化讲义是一套的&#xff0c;做的时候可以很明显感觉到&#xff0c;严选题上面的题跟讲义也是对应上的。如果大家要选择严选题&#xff0c;那么建议搭配武忠祥老师的强化课和强化讲义一起使用。&#x1f60e; 我当时强化阶段也是跟武老师的强化课&#xf…

欧洲智慧能源展揭幕,海博思创闪耀登场展示储能创新

近日&#xff0c;备受瞩目的欧洲智慧能源展&#xff08;The Smarter E Europe&#xff09;盛大开幕&#xff0c;吸引了全球能源行业的目光。在这场国际性的盛会中&#xff0c;中国储能行业的领军企业海博思创凭借卓越的技术实力和创新的解决方案&#xff0c;成为展会上一颗耀眼…

AOP在业务中的简单使用

背景 业务组有一些给开发用的后门接口&#xff0c;为了做到调用溯源&#xff0c;业务组最近需要记录所有接口的访问记录&#xff0c;暂时只需要记录接口的响应结果&#xff0c;如果调用失败&#xff0c;则记录异常信息。由于后门接口较多以及只是业务组内部轻度使用&#xff0…

vim未找到命令,且yum install vim安装vim失败

vim未找到命令&#xff0c;且yum安装vim失败 1、wget更新yum云资源&#xff0c;本次更新为华为云镜像资源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repowget报未找到命令&#xff0c;请查看文章Linux wget…

黑马苍穹外卖技术亮点 详情

1.使用工厂模式和策略模式实现布隆过滤器解决缓存穿透问题 Bitmap Bitmap是一种数据结构&#xff0c;它使用位图来表示数据。在处理大量数据时&#xff0c;Bitmap可以通过将每个数据元素映射到一个位&#xff0c;然后使用位运算来对数据进行操作。 通过使用Bitmap&#xff0c…

C++期末整理

课堂笔记 构造与析构 #include <iosteam> #include <cstring> using namespace std;struct Date {int y, m, d;void setDate(int, int, int);Date(int yy, int mm, int dd) {y yy, m mm, d dd;} };class Student { private:char* name;Date birthday; public:…

视频号矩阵源码:构建短视频生态的基石

在数字化时代&#xff0c;视频内容已成为连接品牌与消费者的重要桥梁。视频号矩阵源码&#xff0c;作为短视频营销自动化的创新引擎&#xff0c;正在帮助内容创作者和营销团队以前所未有的效率和智能&#xff0c;管理和扩展他们的视频内容。本文将深入探讨视频号矩阵源码的核心…

RTL8211FSI PHY电路设计

文章目录 硬件设计引脚功能框图说明PHYADDRPageLED 模式自动协商/速度/全半双工模式Soft Reset上电顺序 原理图设计参考 软件控制&#xff08;FPGA&#xff09;硬件调试 硬件设计 引脚 笔者前代数字采集板采用的 PHY 芯片是博通 Boardcom 的 B50610&#xff0c;其仅支持 0 ∼…

leetcode 152. 乘积最大子数组「贪心」「动态规划」

152. 乘积最大子数组 题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff0c;并返回该子数组所对应的乘积 思路1&#xff1a;贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数&#xff0c;所以多乘一些数肯定不会让绝…

Java 方法中循环调用具有事务的方法

在Java中&#xff0c;循环调用一个具有事务的方法时&#xff0c;需要特别注意事务的边界和管理。通常&#xff0c;事务的边界是由框架&#xff08;如Spring&#xff09;来控制的&#xff0c;确保方法执行时数据的完整性和一致性。然而&#xff0c;在循环中调用事务方法时&#…

RAG:本地部署Langchain-Ollma(Windows)

RAG&#xff1a;本地部署Langchain&#x1f99c;&#x1f517;-Ollma&#x1f42b;(Windows) RAG&#xff0c;即“Retrieval Augmented Generation”&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合了检索和生成技术的自然语言处理模型。它主要用于文本生成任务&…

对SRS媒体服务器进行漏洞扫描时,SRS的API模块会出现漏洞,如何修补这些漏洞的简单方法

目录 一、引言 1、srs介绍 2、媒体流介绍 3、应用场景 二、SRS的http_api介绍、及漏洞 1、概述 2、http_api模块的作用 &#xff08;1&#xff09;提供HTTP API服务 &#xff08;2&#xff09;管理和监控SRS服务器 &#xff08;3&#xff09;自定义开发 三、漏洞扫描…

单位立方体各个面上的法向量,向量场以及每个面上的通量

单位立方体各个面上的法向量&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 以及每个面上的通量 flyfish 假设我们有一个单位立方体&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 在该立方体上。 法向量 &#xff1a;单位立方…

情绪识别反馈训练系统

系统应用简介 情绪识别检测训练系统可以通过语音、实时面部表情、静态情绪图片智能检测使用者的情绪&#xff0c;对异常情绪进行预警&#xff0c;以达到及时明晰情绪状态并辅助缓解负性情绪的目的。 应用范围&#xff1a;适用于年满足12周岁及以上人群。 二、系统基本原理 …

前端面试题14(贝塞尔曲线)

贝塞尔曲线在前端开发中经常用于创建平滑的动画路径或绘制复杂的矢量图形。贝塞尔曲线可以是一次、二次或三次的&#xff0c;其中三次贝塞尔曲线是最常见的&#xff0c;因为它提供了足够的灵活性来创建各种形状&#xff0c;同时保持计算上的可行性。 下面我将解释三次贝塞尔曲…

代码随想录算法训练营第五十九天 | 110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长、复习

110.字符串接龙 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1183 文档讲解&#xff1a;https://programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html 思路 本题只需要求出最短路径的长度就可以了&#xff0c;不用找出…

使用 Qt 实现自定义拖动窗口

文章目录 如何在 Qt 中实现无标题栏窗口的拖动准备工作创建自定义窗口类使用 QDialog 实现拖动功能详细解释代码行解释 小结 如何在 Qt 中实现无标题栏窗口的拖动 在许多桌面应用程序中&#xff0c;我们经常需要自定义窗口外观&#xff0c;包括去掉标题栏&#xff0c;使窗口看…