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

代码随想录算法训练营第60期第三十四天打卡

       大家好,我们今天的内容依旧是贪心算法,我们上次的题目主要是围绕多维问题,那种时候我们需要分开讨论,不要一起并发进行很容易顾此失彼,那么我们今天的问题主要是重叠区间问题,又是一种全新的贪心算法思想,这里的题目如果我们之前没有接触过,我们就很难想到今天的解题思路,这里的题目我建议大家可以直接看题解,看完题解后多思考就可以了。

第一题对应力扣编号为452的题目用最少数量的箭引爆气球

        我们一起来看到这一道题目,这一道题目的话考察的应该是重叠区间问题,上面说过了这种思路不好想,那我们就一起来看看这道题目:

        题目其实读一遍大概就了解了我们题目的要求,我们在某一个位置射出弓箭,只要这个气球的直径的范围包含了我这个发射弓箭的位置那我们就可以引爆气球,很明显这是一个重叠区间问题,我们应该用一支弓箭引爆尽可能多的气球,我们一起来看一下这道题目的解题思路,首先局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。贪心算法可以解决这一道题目,

       大家来看我们的示例画出来的图,这是我们排好序的气球,如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。这里是按照气球的起始位置排序,这样我们就应该正序遍历,靠左尽可能让气球重复。如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。这个思想很重要大家可以看到上图,我们是不是要在有重合的气球的右边边界的最小值引一支弓箭,没有重叠的气球一定是不可能一支箭可以引爆的,根据上图可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。根据这个思路我们可以尝试写出解题代码:

class Solution {
private:
//这个是我们按照气球的起始位置从小到大排序static bool cmp(const vector<int> &a , const vector<int> &b){return a[0] < b[0];}
public:int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;//排序sort(points.begin(), points.end(), cmp);int result = 1; // 只要有气球起码就得需要一直弓箭引爆for (int i = 1; i < points.size(); ++i){//这种情况需要一支箭 气球i和气球i-1不挨着 怎么得使用一直弓箭射爆//我需要解释一下这里为什么不加等于,大家看题目x_start <= x <= x_end就可以算作重叠可以引爆//也就是我下一个气球的左边界等于上一个气球的右边界的话也算作重叠 if (points[i][0] > points[i - 1][1]) result++;//更新右边界为什么要更新右边界这个大家注意我们是判断了两个气球是重合的但是与第三个气球是否重合呢?这就得需要更新右边界来比较//在遍历的过程中如果我发现目前的最小右边界与第三个气球的左边界不重合了说明我就用一支箭去射爆那两个气球else points[i][1] = min(points[i - 1][1], points[i][1]);}return result;}
};

       我给大家写出了详细的注释,大家好好理解,理解我们的区间重叠问题,我们什么时候可以确定我们的两个气球是否重叠,以及什么情况下需要一支新的弓箭,大家仔细理解,我们进入下一道题目。

第二题对应力扣编号为435的题目无重叠区间

       我们来到第二题,很明显一看题目名称我们就知道这应该还是区间重合问题,我们一起来看一下这道题目:

       这道题其实与上一道题目有异曲同工之妙,还是判断两个区间是否重合,但是有一点不一样,就是上一道题目我们如果边界相等的时候我们是可以视为重合的一支箭可以射爆,但这里如果只有一个点重合不能算作是重叠,我们来看一下这道题应该如何解决,我这里给大家讲解我们排序左边界的情况,当然我也给出右边界的情况大家视情况而定,其实左边界我个人感觉比较好理解,主要上一道题我们也是排序的左边界,我们依旧是判断两个区间是否重叠 ,大家注意这里的不重叠的条件是下一个区间的左边界大于等于上一个区间的有边界才是,如果重叠了我们统计重叠的区间,然后更新右边界来判断后续区间是否还是重叠的,大家上一道题目理解的话这道题就不难了,我给出左边界的代码:

class Solution {
private:
//按照左边界排序static bool cmp(const vector<int> &a , const vector<int> &b){return a[0] < b[0];}
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;//按照特定规则排序sort(intervals.begin(), intervals.end(), cmp);int count = 0; //统计重叠区间的个数int end = intervals[0][1];for (int i = 1; i < intervals.size(); ++i){//表示上来的两个区间并不重合//我们就更新右边界无需操作反正都是不重叠的if (intervals[i][0] >= end) end = intervals[i][1];//这里是重叠else{//更新最小的右边界end = min(intervals[i][1], end);count++;} }return count;}
};

     我也给出右边界的代码供大家参考:

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的题目划分字母区间

        我们来到今天的最后一题,我相信只要大家把这三道题目弄明白几乎重叠区间问题大家就会有很清楚的了解了,我们一起来看一下今天的最后一道题目:

        题目是什么意思呢?我们要划分为尽可能多的片段,使得原字符串里面的每一个字符都出现在划分好的一个字符串里,而且还不能打乱顺序,使得这些划分好的字符串拼起来还是原字符串,我们需要划分的片段尽可能多,那么应该如何考虑这个问题呢?其实有些朋友可能会觉得这题奇怪我们原则上应该都是求尽可能少的情况,但是这里大家一想你要尽可能少直接不要划分了不就是了,这样肯定题目只能问尽可能多,拿示例一来举例,我出现了字符a,那么我所有的a都要包含进来,我们统计我们a出现的最远位置下标,然后统计过程中b又出现了所以b只能与a分割在一个字符串里面了,然后后来c也出现了我的字符串中,因此c只能与a,b分割在同一个字符串中,最后我们发现a的最远位置就是第一个字符串的长度,接下来e也是一样的道理,还有h都是一样的道理,我们就可以发现我们是需要求出我们每一个字符的最远出现位置的下标,然后我们去求每一个区间长度的时候我们就得用双指针了,然后我们求完一个区间长度我们保存到数组里面,我们讲下一个区间的起始索引交给左指针,最后我们返回result就可以了,我们有了这个思路一起来看一下代码应该如何写:

class Solution {
public:vector<int> partitionLabels(string s) {//统计每一个字符的最远出现位置int hash[27] = {0};//如何统计最远出现距离大家注意我的i一直在动这样可以找出最远出现的位置的下标for (int i = 0; i < s.size(); ++i){hash[s[i] - 'a'] = i;}int left = 0, right = 0;vector<int> result;//这个大家要注意eccbbbbdec举例 hash[2] = 9(c) hash[1] = 6(b) hash[4] = 8(e) hash[3] = 7(d)// right = 8 right = 9 right = 6 right = 7 right = 8 right = 9 到了最后才会满足i == right//我们i == right 就是在寻找区间分界线for (int i = 0; i < s.size(); ++i){right = max(right, hash[s[i] - 'a']);if (i == right){result.push_back(right - left + 1);//这一个区间找完了接着下一个区间left = i + 1;}}return result;}
};

       我给大家写好了注释,大家参考一下。

今日总结

          今天的区间重叠问题还是很有趣的,体现了贪心的思想,我们到底是按照左边还是右边排序,这个大家都要思考清楚才可以,今天的分享就到这里了,我们下次再见!

相关文章:

代码随想录算法训练营第60期第三十四天打卡

大家好&#xff0c;我们今天的内容依旧是贪心算法&#xff0c;我们上次的题目主要是围绕多维问题&#xff0c;那种时候我们需要分开讨论&#xff0c;不要一起并发进行很容易顾此失彼&#xff0c;那么我们今天的问题主要是重叠区间问题&#xff0c;又是一种全新的贪心算法思想&a…...

Midscene.js Chrome 插件实战:基于 AI 驱动 WEB UI 自动化测试「喂饭教程」

Midscene.js Chrome 插件实战:基于 AI 驱动 WEB UI 自动化测试「喂饭教程」 前言一、Midscene.js 简介二、环境准备与插件安装1. 安装 Chrome 插件2. 配置模型与 API Key三、插件界面与功能总览四、实战演练:用自然语言驱动网页自动化1. 典型场景一(Action):账号登录步骤一…...

JVM——方法内联之去虚化

引入 在Java虚拟机的即时编译体系中&#xff0c;方法内联是提升性能的核心手段&#xff0c;但面对虚方法调用&#xff08;invokevirtual/invokeinterface&#xff09;时&#xff0c;即时编译器无法直接内联&#xff0c;必须先进行去虚化&#xff08;Devirtualization&#xff…...

Objective-C Block 底层原理深度解析

Objective-C Block 底层原理深度解析 1. Block 是什么&#xff1f; 1.1 Block 的本质 Block 是 Objective-C 中的特殊对象&#xff0c;实现了匿名函数的功能 通过 isa 指针继承自 NSObject&#xff0c;可以响应&#xff08;如 copy、retain、release&#xff09;等内存管理方…...

关于IDE的相关知识之二【插件推荐】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于ide插件推荐的相关内容&#xff01…...

Python+Streamlit实现登录页

PythonStreamlit实现登录页 Streamlit 是一个开源的 Python 库&#xff0c;专为数据科学家和机器学习工程师设计&#xff0c;用于快速构建交互式 Web 应用。 其核心功能与特点包括&#xff1a; 1.快速原型开发 2.交互式数据展示 3.极简开发 4.实时更新 5.内置组件 6.无前端依赖…...

RDD案例数据清洗

在 Spark 中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff09;是分布式数据集的基本抽象。数据清洗是数据预处理中的一个重要步骤&#xff0c;通常包括去除重复数据、过滤无效数据、转换数据格式等操作。以下是一个使用 RDD 进行数据清洗的完整示例。 示…...

按键精灵ios脚本新增元素功能助力辅助工具开发(三)

元素节点功能&#xff08;iOSElement&#xff09;​ 在按键精灵 iOS 新版 APP v2.2.0 中&#xff0c;新增了元素节点功能 iOSElement&#xff0c;该功能包含共 15 个函数。这一功能的出现&#xff0c;为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...

Axure RP9:列表新增

文章目录 列表新增思路新增按钮操作说明保存新增交互设置列表新增 思路 利用中继器新增行实现列表新增功能 新增按钮操作说明 工具栏中添加新增图标及标签,在图标标签基础上添加热区;对热区添加鼠标单击时交互事件,同步插入如下动作:显示/隐藏动作,设置目标元件为新增窗…...

06 mysql之DML

一、什么是DML DML 用于操作数据库中的数据。主要命令包括&#xff1a; INSERT&#xff1a;添加数据SELECT&#xff1a;查询数据UPDATE&#xff1a;修改数据DELETE&#xff1a;删除数据 二、插入数据&#xff08;INSERT&#xff09; 2.1 插入单条记录 -- 插入学生记录&…...

游戏引擎学习第277天:稀疏实体系统

回顾并为今天定下基调 上次我们结束的时候&#xff0c;基本上已经控制住了跳跃的部分&#xff0c;达到了我想要的效果&#xff0c;现在我们主要是在等待一些新的艺术资源。因此&#xff0c;等新艺术资源到位后&#xff0c;我们可能会重新处理跳跃的部分&#xff0c;因为现在的…...

【最新版】likeshop连锁点餐系统-PHP版+uniapp前端全开源

一.系统介绍 likeshop外卖点餐系统适用于茶饮类的外卖点餐场景&#xff0c;搭建自己的一点点、奈雪、喜茶点餐系统。 系统基于总部多门店的连锁模式&#xff0c;拥有门店独立管理后台&#xff0c;支持总部定价和门店定价LBS定位点餐&#xff0c;可堂食可外卖。无论运营还是二开…...

机器学习之决策树模型:从基础概念到条件类型详解

机器学习之决策树模型&#xff1a;从基础概念到条件类型详解 摘要&#xff1a;本文深入探讨决策树模型的概念、构成以及不同条件类型。首先介绍决策树的基本结构和工作原理&#xff0c;随后详细阐述轴心对齐条件与倾斜条件、二元条件与非二元条件的差异及应用场景&#xff0c;…...

网络编程(一)网络编程入门

本节课学习TCP客户端和服务器端编程架构&#xff0c;其分为分为C/S&#xff08;客户端/服务器模式&#xff09;和B/S&#xff08;浏览器/服务器架构模式&#xff09;两种模式。接下来我们分别了解这两种模式 C/S模式 C/S模式&#xff1a;服务器首先先启动&#xff0c;并根据客…...

黑名单中的随机数-leetcode710

题目描述 给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法&#xff0c;从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。 优化你的算法&am…...

纯Java实现反向传播算法:零依赖神经网络实战

在深度学习框架泛滥的今天,理解算法底层实现变得愈发重要。反向传播(Backpropagation)作为神经网络训练的基石算法,其实现往往被各种框架封装。本文将突破常规,仅用Java标准库实现完整BP算法,帮助开发者: 1) 深入理解BP数学原理。2) 掌握面向对象的神经网络实现。3) 构建可…...

海纳思(Hi3798MV300)机顶盒遇到海思摄像头

海纳思机顶盒遇到海思摄像头&#xff0c;正好家里有个海思Hi3516的摄像头模组开发板&#xff0c;结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口&#xff0c;确保网络正常通信。 …...

MCP项目实例 - client sever交互

1. 项目概述 项目目标 构建一个本地智能舆论分析系统。 利用自然语言处理和多工具协作&#xff0c;实现用户查询意图的自动理解。 进行新闻检索、情绪分析、结构化输出和邮件推送。 系统流程 用户查询&#xff1a;用户输入查询请求。 提取关键词&#xff1a;从用户查询中…...

Axure应用交互设计:表格跟随菜单移动效果(超长表单)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!本文如有帮助请订阅 Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:表格跟随菜单移动 主要内容:表格交互设计、动态面板嵌套、拖动时事件、移动动作 应用场景…...

7系列 之 I/O标准和终端技术

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…...

github 上的 CI/CD 的尝试

效果 步骤 新建仓库设置仓库的 page 新建一个 vite 的项目&#xff0c;改一下 vite.config.js 中的 base 工作流 在项目的根目录下新建一个 .github/workflows/ci.yml 文件&#xff0c;然后编辑一下内容 name: Build & Deploy Vue 3 Appon:push:branches: [main]permi…...

Scala和Go差异

Scala和Go&#xff08;又称Golang&#xff09;是两种现代编程语言&#xff0c;各自具有独特的特性和设计哲学。 尽管它们都可以用于构建高性能、可扩展的应用程序&#xff0c;但在许多方面存在显著差异。 Scala和Go的详细比较&#xff0c;涵盖它们的异同点&#xff1a; 1. 语…...

yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置(适配 React Table)

yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置&#xff08;适配 React Table&#xff09; Categories: Tools Last edited time: May 11, 2025 7:45 PM Status: Done Tags: form validation, schema design, yup 本文介绍如何通过 Yup 的 meta() 字段&#xff0…...

类初始化方法

一、类初始化方法 成员初始化列表 class Point {int x, y; public:Point(int a, int b) : x(a), y(b) {} };就地初始化&#xff08;C11&#xff09; 声明时初始化。 class Widget {int size 10; // 类内成员初始化vector<int> data{1,2,3}; };特殊情况&#xff1a;静…...

【OpenCV】imread函数的简单分析

目录 1.imread()1.1 imread()1.2 imread_()1.2.1 查找解码器&#xff08;findDecoder&#xff09;1.2.2 读取数据头&#xff08;JpegDecoder-->readHeader&#xff09;1.2.2.1 初始化错误信息&#xff08;jpeg_std_error&#xff09;1.2.2.2 创建jpeg解压缩对象&#xff08;…...

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …...

【笔记】BCEWithLogitsLoss

工作原理 BCEWithLogitsLoss 是 PyTorch 中的一个损失函数&#xff0c;用于二分类问题。 它结合了 Sigmoid 激活函数和二元交叉熵&#xff08;Binary Cross Entropy, BCE&#xff09;损失在一个类中。 这不仅简化了代码&#xff0c;而且通过数值稳定性优化提高了模型训练的效…...

Oracle SYSTEM/UNDO表空间损坏的处理思路

Oracle SYSTEM/UNDO表空间损坏是比较棘手的故障&#xff0c;通常会导致数据库异常宕机进而无法打开数据库。数据库的打开故障处理起来相对比较麻烦&#xff0c;读者可以参考本书第5章进一步了解该类故障的处理过程。如果数据库没有备份&#xff0c;通常需要设置官方不推荐的隐含…...

为什么 cout<<“中文你好“ 能正常输出中文

一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的&#xff01;C的字符串和python2的字符串模型类似&#xff0c;也就是普通的字符串是ASCII字符串和字节串两种语义&#xff0c;类似重载或多态&#xff0c;有时候解释为整数&#xff0c;有时候是字节串。Uni…...

Leetcode 3547. Maximum Sum of Edge Values in a Graph

Leetcode 3547. Maximum Sum of Edge Values in a Graph 1. 解题思路2. 代码实现 题目链接&#xff1a;3547. Maximum Sum of Edge Values in a Graph 1. 解题思路 这一题主要是在问题的分析上面。由题意易知&#xff0c;事实上给定的图必然只可能存在三种可能的结构&#x…...