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;}
};

贪心算法总结 

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

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

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

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

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

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

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

相关文章

firewalld(6)自定义services、ipset

简介 在前面的文章中我们已经介绍了zone、rich rule 、--direct等功能和基本配置。在前面文章中&#xff0c;我们提到过firewalld内置了很多服务&#xff0c;可以通过firewall-cmd --get-services来查看服务&#xff0c;也可以通过配置文件查看这些服务/var/lib/firewalld/ser…

直面生产制造的8大核心痛点

1.制造部门的计划紊乱问题 1.1计划的重要性与常见缺陷 计划是制造部门高效运作的前提。在实际运作中&#xff0c;计划的缺失或不周会导致生产效率的大幅降低。常见缺陷包括&#xff1a; -缺乏综合的生产计划&#xff0c;过分依赖销售计划&#xff0c;忽视生产和采购的实际能…

盘点2024年6月Sui生态发展,了解Sui近期成长历程

随着区块链技术的迅猛发展&#xff0c;Sui生态在2024年6月取得了令人欣喜的进步。作为创新的L1协议&#xff0c;Sui不仅在技术革新方面表现突出&#xff0c;还在DeFi、游戏应用和开发者工具等领域展现出强大的潜力。本篇文章将全面盘点Sui在过去一个月内的生态发展&#xff0c;…

堆溢出ret2libc

堆溢出–ret2libc 题目&#xff1a; [HNCTF 2022 WEEK4]ezheap | NSSCTF 讲解&#xff1a; 题目保护全开&#xff0c;要泄漏基地址&#xff1a; 利用栈溢出覆盖put参数泄漏libc基地址&#xff0c;再第二次用system的地址覆盖put函数&#xff0c;实现ret2libc。 泄漏libc…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

Gemini for China 大更新,现已上架 Android APP!

官网&#xff1a;https://gemini.fostmar.online/ Android APP&#xff1a;https://gemini.fostmar.online/gemini_1.0.apk 一、Android APP 如果是 Android 设备&#xff0c;则会直接识别到并给下载链接。PC 直接对话即可。 二、聊天记录 现在 Gemini for China&#xff…

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径&#xff1a;/admin/student 请求方法&#xff1a;POST 请求参数&#xff1a;请求头&#xff1a;Headers&#xff1a;"Content-Type": "application/json" 请求体&#xff1a;Body&#xff1a; id 学生id …

计算机网络性能指标概述:速率、带宽、时延等

在计算机网络中&#xff0c;性能指标是衡量网络效率和质量的重要参数。本文将综合三篇关于计算机网络性能指标的文章&#xff0c;详细介绍速率、带宽、吞吐量、时延、时延带宽积、往返时延&#xff08;RTT&#xff09; 和利用率的概念及其在网络中的应用。 1. 速率&#xff08;…

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案&#xff01; 详细功能见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

继 承

为什么要有继承&#xff0c;继承的作用&#xff1f; 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称派生类。 …

Qt源码解析之QObject

省去大部分virtual和public方法后&#xff0c;Qobject主要剩下以下成员&#xff1a; //qobject.h class Q_CORE_EXPORT Qobject{Q_OBJECTQ_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)Q_DECLARE_PRIVATE(QObject) public:Q_I…

学习mybatis

1、 2、mybatis是什么 mybatis为DAO层提供了解决方案的这样一个框架既然他是为DAO层提供了解决方案 那么说明他的主要功能和JDBC以及dbutils是一样的都是实现数据库的增删改查3、mybatis能干什么 数据库的增删改查的实现4、有了JDBC为什么还要学习mybatis SSH&#xff1a;s…

【紫外线发光器件小结】 UV-B LED 308nm

之前有介绍光的波长和频率计算。 波长小于390nm,频率高于770太赫兹的电磁波忙&#xff0c;或者光。基本有一段就叫做紫外线。 紫外线有分为UV-A/B/C;三小段&#xff1b; 如下图&#xff1a; 高压汞灯与UV LED的光谱&#xff1b;黑色线汞灯&#xff0c;蓝色LED

FreeRTOS 列表和列表项

这里推荐看完韦东山的C语言本质和韦东山的rtos快速入门视频 在 FreeRTOS 的源码中大量地使用了列表和列表项&#xff0c;因此想要深入学习 FreeRTOS&#xff0c;列表和 列表项是必备的基础知识。这里所说的列表和列表项&#xff0c;是 FreeRTOS 源码中 List 和 List Item 的 直…

C++规范

一、VS工具集列表&#xff1a; Visual Studio 2008&#xff1a;v90 Visual Studio 2010&#xff1a;v100 Visual Studio 2012&#xff1a;v110 Visual Studio 2013&#xff1a;v120 Visual Studio 2015&#xff1a;v140 &#xff08;v140_xp&#xff09; Visual Studio 2017&a…

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式&#xff0c;它将软件的系统分为&#xff0c;&#xff08;视图&#xff0c;模型&#xff0c;控制器&#xff09;三个部分 1.1View(视图) 视图也就是&#xff0c;在浏览器显示的那一个部分&#xff0c;是后端数据的呈现 1.…

微型导轨如何提升数控机床的稳定性?

数控机床是加工设备中常用的机床&#xff0c;精度和稳定性是衡量数控机床性能的重要指标。而微型导轨作为数控机床中重要的传动元件&#xff0c;数控机床与其具体结构性能是密不可分的&#xff0c;那么微型导轨如何提高数控机床的稳定性呢&#xff1f; 1、微型导轨通过采用先进…

一个pdf分割成多个pdf,一个pdf分成多个pdf

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛欢迎。但有时候&#xff0c;我们可能需要将一个大的pdf文件分割成多个小文件&#xff0c;以便于分享、打印或编辑。今天&#xff0c;我就来教大家几种简单有效的方法&#xff0c;让你轻松实现pdf文件…

家里老人能操作的电视直播软件,目前能用的免费看直播的电视软件app,适合电视和手机使用!

2024年许多能看电视直播的软件都不能用了&#xff0c;家里的老人也不会手机投屏&#xff0c;平时什么娱乐都没有了&#xff0c;这真的太不方便了。 很多老人并不喜欢去买一个广电的机顶盒&#xff0c;或者花钱拉有线电视。 现在的电视大多数都是智能电视&#xff0c;所以许多电…