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

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天,贪心最后一节(ง •_•)ง💪,编程语言:C++

目录

56.合并区间

738.单调递增的数字

968.监控二叉树 

贪心算法总结 


56.合并区间

文档讲解:代码随想录合并区间

视频讲解:手撕合并区间

题目:

学习:本题属于区间问题,同样是找到重合的区间,与用最少数量的箭引爆气球和无重叠区间问题解法是相同的。

本题可以先对区间进行排序,便于找到重叠区间,可以依照每个区间的左边界从小到大排序。之后比较后续区间的左边界,与前一个区间的右边界的关系,判断是否重叠。如果不重叠,则加入答案数组中,如果重叠则更新最大右边界。

代码:

//时间复杂度O(nlogn)快速排序时间复杂度
//空间复杂度O(logn)快速排序空间复杂度
class Solution {
public:static bool camp(vector<int>& a, vector<int>& b) {return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {//先进行排序,按照开始节点进行排序sort(intervals.begin(), intervals.end());vector<vector<int>> result; //返回数组//初始化左右边界int left = intervals[0][0];int right = intervals[0][1];for(int i = 1; i < intervals.size(); i++) {if(intervals[i][0] <= right) {right = max(right, intervals[i][1]);}else {result.push_back({left, right});right = intervals[i][1];left = intervals[i][0];}}//把最后一个点加入result.push_back({left, right});return result;}
};

本题还可以不设置单独的left,right来作为左边边界,而是使用back()来作为右边界进行更新。同时由于我们提前进行了排序,左边界又能够保证是按从小到大顺序进入的。

代码:

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {//使用lambda表达式sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});vector<vector<int>> result; //返回数组//使用back()来确定result.push_back(intervals[0]); //初始化区间for(int i = 1; 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;}
};

738.单调递增的数字

文档讲解:代码随想录单调递增的数字

视频讲解:手撕单调递增的数字

题目:

学习:本题重点在于需要比较每个位上的大小,来判断是否是单调递增的。贪心的方法就在于如果数不是单调递增的该如何处理。假设出现 num[i - 1] > num[i] 的情况,也就是前一位比后一位大的情况。由于需要单调递增,且不允许增大数,因此我们的贪心逻辑是,一旦出现num[i - 1] > num[i]的情况,我们就将前一位num[i - 1]--,同时将num[i]及以后的位变为9,这样就既能保证单调递增,数又是最大的。

本题我们需要从后往前遍历,我们需要利用后面比较的结果。以332为例子,如果从前往后遍历,将得到329,显然答案不对。如果从后往前遍历则是299,显然最终答案应该是这个。

写代码的时候可以注意两个关键点:

  1. 可以利用to_string()函数将数字变换为字符串,方便进行遍历处理。最后可以通过stoi()函数将字符串重新转变为int型变量。
  2. 可以设置一个flag位,确定后续要变9的位置,显然,我们只要找到最后一个需要减1的位置,后面的位就是需要置为9的。

代码:

//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
public:int monotoneIncreasingDigits(int n) {//从后往前遍历,遇到前面的数大的情况,进行“前减一,后置9”的操作string str = to_string(n); //为了方便遍历,将int型变量转换为字符串(★)int flag = str.size(); //记录需要后置为9的位置//找到最后一个不单调的位置for(int i = str.size() - 1; i > 0; i--) {if(str[i] < str[i - 1]) {flag = i; //记录需要变9的位置str[i - 1]--; //进行减1} }for(int i = flag; i < str.size(); i++) {str[i] = '9'; //进行变9}return stoi(str);}
};

968.监控二叉树 

文档讲解:代码随想录监控二叉树

视频讲解:手撕监控二叉树

题目:

学习:本题的关键在于,思考如何放置摄像头才能使得摄像头的数量最小。从例子中我们可以发现,摄像头均没有放在叶子节点上。我们知道摄像头能够覆盖上中下三层,如果摄像头放在叶子节点上就必然会使得有一层是浪费的。虽然头节点放摄像头也会使得浪费一层,但是相较于头节点,叶子节点显然更多,因此叶子节点不放摄像头数量节省下来的是指数阶的。

本题的贪心就在于,局部最优:让叶子节点的父节点安装摄像头,摄像头数量最少;整体最优:全部摄像头数量所用最少。

理解了上述的贪心逻辑,我们还需要解决如下两个问题:1.二叉树的遍历;2.如何隔两个节点放一个摄像头。

1.二叉树的遍历顺序,显然我们要保证叶子节点的父节点有摄像头,且要尽可能的少放摄像头,我们需要从底往上,判断当前位置是否被覆盖,是否放置摄像头。因此需要采用后序遍历的方式。

2.如何隔两个节点放一个摄像头,对于一个节点来说,可能存在3种状态:没有被覆盖,该处有摄像头,该处没有摄像头但是被覆盖。而对于一个节点是否要安装一个摄像头,我们就需要判断左右孩子处于什么状态,如果左右孩子有一个处于没有被覆盖的状态,我们就需要在当前节点安装一个摄像头,并告诉其父节点自身有摄像头。

基于以上需求,我们可以设置3个数字来表示,当前节点的状态:

  • 0:该节点无覆盖
  • 1:本节点有摄像头
  • 2:本节点有覆盖。

然后通过递推关系,来判断当前节点应该处于什么状态。如果处于1状态,我们就需要记录一个摄像头。

接下来我们就需要进行遍历过程中,递归三部曲的设置了:

1.确定返回值和参数列表:由于我们需要使用三个数字来表示当前节点的状态,因此我们返回值需设置为int型,参数列表传入root。

2.确定终止条件:由于我们需要左右孩子的情况,来判断当前节点处于的状态,因此我们需要遍历到最后的空节点(解决只有左右一个孩子的情况),而对于空节点应该处于什么状态,我们需要进行确定。为了让叶子节点不放摄像头,而叶子节点的父节点放摄像头,则叶子节点应该处于无覆盖的情况,且不能放置摄像头,因此空节点应该处于的是有覆盖的情况,这样才能推出叶子节点是无覆盖的。

3.单层递归逻辑:采用的是后序遍历,而后我们需要处理的“中”逻辑有四种情况:

  • 左右节点都有覆盖:则此时中间节点就应该是无覆盖的情况
  • 左右节点至少有一个无覆盖的情况:则中间节点应该安装一个摄像头。
  • 左右节点至少有一个有摄像头:则中间节点处于有覆盖的情况。
  • 头结点没有覆盖:头节点我们需要单独进行处理,因为头节点可能处于没有覆盖的情况。

基于以上,我们可以写出代码:

//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
public:int result = 0; //定义全局变量,记录摄像头的个数//遍历树,1.确定返回值和参数列表//我们使用0,1,2来表示当前节点的三种状态:无覆盖(0)、有摄像头(1)、有覆盖(2);int traversal(TreeNode* root) {//确定终止条件if(root == nullptr) {return 2; //为了让叶子节点的父节点安装摄像头,空节点应设置为有覆盖,这样遍历到叶子节点默认左右孩子为有覆盖自身为无覆盖。}//采用后续遍历的方式,进行单层递归逻辑int left = traversal(root->left); //左int right = traversal(root->right); //右//中:分为三种情况//1.左右孩子均为有覆盖if(left == 2 && right == 2) {return 0; //则当前节点返回无覆盖}//2.左右孩子有一个是无覆盖(包含了5种情况)// left == 0 && right == 0 左右节点无覆盖// left == 1 && right == 0 左节点有摄像头,右节点无覆盖// left == 0 && right == 1 左节点有无覆盖,右节点摄像头// left == 0 && right == 2 左节点无覆盖,右节点覆盖// left == 2 && right == 0 左节点覆盖,右节点无覆盖if(left == 0 || right == 0) {result++; //则该节点需要有一个摄像头return 1;}//3.在上一个情况筛选的基础上,左右孩子有一个是有摄像头的if(left == 1 || right == 1) {return 2; //返回有覆盖}return -1; //在没有写else的情况下,需要加一个return,但实际上该return不会运行到}int minCameraCover(TreeNode* root) {//头节点单独处理判断if(traversal(root) == 0) { //如果头节点没有被覆盖result++;}return result;}
};

贪心算法总结 

文档讲解:代码随想录贪心算法总结

贪心算法一句话:没有套路,多加练习,手动模拟。

贪心算法的题目可以分为: 

题目之间并没有明显的顺序关系,重点还是要多加联系。 

一个系列的结束,标志着另一个系列的开始,动态规划!继续加油💪

相关文章:

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…...

springboot装修接单平台-计算机毕业设计源码25005

摘要 随着装修行业的快速发展和数字化趋势&#xff0c;传统的装修接单方式已显不足以满足用户需求&#xff0c;因此建立一个便捷高效的平台具有重要意义。通过利用Java语言的跨平台特性和强大的编程能力&#xff0c;结合SpringBoot框架的快速开发特性和Mysql数据库的稳定性&…...

matlab仿真 信道(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 之前的内容还剩下simulink的仿真过程。 3.simulink中的AWGN模块仿真 系统框图如图所示&#xff0c;TX和RX 模块需要单独实现…...

华宇携TAS应用中间件亮相2024年山东江信智能信创产品推介会

信创产业是数据、网络安全的基础&#xff0c;也是“新基建”的重要内容&#xff0c;将成为拉动经济发展的重要抓手之一。 7月5日&#xff0c;以“信守时代机遇&#xff0c;创造辉煌未来”为主题的山东江信智能信创产品推介会在济南举办。本次产品推介会汇聚了国内众多信息技术…...

单向链表的数据存储(申请堆空间)

函数功能&#xff1a; 0.排序&#xff08;逆置和顺序排序&#xff09; 1.回显 2.头插 3.位插 4.尾插 5.尾删 6.头删 7.位删 8.查找 &#xff08;按值或按位查找&#xff09; 9.修改 &#xff08;按值或按位修改&#xff09; 10.退出 main.c …...

MySQL8之mysql-community-common的作用

在MySQL 8中&#xff0c;mysql-community-common是一个软件包&#xff0c;它提供了MySQL服务器和客户端库所需的一些共同文件。具体来说&#xff0c;mysql-community-common的作用包括但不限于以下几点&#xff1a; 1. 提供基础配置和错误信息 错误信息和字符集包&#xff1a…...

Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?

Emacs 是一个功能强大的文本编辑器和应用程序框架&#xff0c;它拥有众多的优点&#xff0c;这些优点使得它在某些情况下成为编程的强大工具。然而&#xff0c;是否用 Emacs 写程序比 IDE 更方便&#xff0c;这很大程度上取决于个人的工作习惯和偏好。 Emacs 的主要优点包括&a…...

如何切换手机的ip地址

在数字时代的浪潮中&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着网络安全问题的日益凸显&#xff0c;保护个人隐私和数据安全变得尤为重要。其中&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其安全性与隐私性备受关注。本文将详…...

前端画图引擎ZRender,echarts的渲染器,你知道吗?

Zrender是一个轻量级的Canvas和SVG渲染库&#xff0c;它提供了一个高性能的图形绘制和交互的解决方案&#xff0c;用于在Web页面上创建丰富的数据可视化和交互式图形。 可能大部分小伙伴不知道这个类库&#xff0c;本文给大家科普一下。 一、Zrender是谁&#xff1f; 该项目…...

web前端开发——标签一

今天我来针对web前端开发讲解标签一 Html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ Ctrl/ &#xff0c;用户可能会获取到注释标签 注释的原则: •和代码逻辑一致 •尽量使用中文 •正能量 标题标签&#xff1a;<h1></h1> h1-h6 标题标签有6…...

【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展

深度学习作为人工智能领域的重要分支&#xff0c;近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新&#xff0c;以及它们在图像识别、自然语言处理&#xff08;NLP&#xff09;等领域的应用进展。 一、深度学习算法与模型创新 新型…...

使用 mongo2neo4j 和 SemSpect 通过各种方式进行图探索

用于可视化和探索每个 MEAN 堆栈背后的数据图的 ETL 您是否正在努力回答有关 MEANS Web 服务数据的紧急问题&#xff1f;哪里有 BI 可以快速回答“上个季度哪些亚洲的artisan.plus 用户触发了订单&#xff1f;”这个问题&#xff0c;而无需编写查询&#xff1f;使用 mongo2neo4…...

淘宝卖家难免遇到的商品问题 在淘宝买的东西出问题了,该如何维权

很多朋友对于淘宝卖家难免遇到的商品问题和在淘宝买的东西出问题了&#xff0c;该如何维权不太懂&#xff0c;今天就由小编来为大家分享&#xff0c;希望可以帮助到大家&#xff0c;下面一起来看看吧&#xff01; [1] 淘宝买东西&#xff0c;过了售后期&#xff0c;有质量问题怎…...

ffmpeg 安装 h264(x264)encoder

#下载并安装x264 # 切换root用户 sudo -i # 输入密码cd ~ mkdir FFmpeg7#下载并安装x264 git clone https://code.videolan.org/videolan/x264.git cd x264 mkdir build./configure --help # 报缺少asm 时 可加入--disable-asm # --prefix/home/llh/ffmpeg/build/ 指定安装目录…...

Java项目:基于SSM框架实现的健康综合咨询问诊平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的健康综合咨询问诊平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…...

SpringBoot源码阅读(4)——事件

从监听器到事件 SpringApplication运行中触发事件&#xff0c;多播器发送事件到监听器&#xff0c;监听器处理事件。 SpingApplication中事件都是经过SpringApplicationRunListeners类传送到各个监听器。 以starting事件为例 void starting(ConfigurableBootstrapContext boo…...

EDI安全:如何在2024年保护您的数据免受安全和隐私威胁

电子数据交换&#xff08;EDI&#xff09;支持使用标准化格式在组织之间自动交换业务文档。这种数字化转型彻底改变了业务通信&#xff0c;消除了对纸质交易的需求并加速了交易。然而&#xff0c;随着越来越依赖 EDI 来传输发票、采购订单和发货通知等敏感数据&#xff0c;EDI …...

RabbitMQ快速入门 - 图像化界面的简单操作

目录 1、RabbitMQ的安装 2、RabbitMQ基本介绍 3、简单案例 4、数据隔离 1、RabbitMQ的安装 官网链接&#xff1a;rabbitmq官网 &#xff08;官网很详细&#xff0c;也可以在官网学习啦~&#xff09; 基础入门&#xff1a;自主学习&#xff1a;最新版本&#xff1a;安装我…...

新版亚组交互效应函数(P for interaction)newscitb5 1.3版本发布--用于一键生成交互效应表

在SCI文章中&#xff0c;交互效应表格&#xff08;通常是表五&#xff09;能为文章锦上添花&#xff0c;增加文章的信服力&#xff0c;增加结果的可信程度&#xff0c;还能进行数据挖掘。什么是亚组&#xff0c;通常就是特殊类型人群&#xff0c;比如男女&#xff0c;种族等&am…...

gpt讲 Observable 对象

什么是 Observable&#xff1f; Observable 是一种用于处理异步数据流的数据类型。它可以发出多个值&#xff0c;这些值可以是同步或者异步产生的&#xff0c;并且可以在时间上发生变化。在 Angular 中&#xff0c;HttpClient 返回的响应对象、事件流以及许多其他异步任务都可…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...