代码随想录算法训练营第37天| Leetcode 738.单调递增的数字、968.监控二叉树

本文主要是介绍代码随想录算法训练营第37天| Leetcode 738.单调递增的数字、968.监控二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Leetcode 738.单调递增的数字
    • Leetcode 968.监控二叉树

Leetcode 738.单调递增的数字

题目链接:Leetcode 738.单调递增的数字
题目描述: 当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于n的最大数字,且数字呈单调递增 。
思路: 本题数据范围太大了,暴力解法肯定会超时,因此需要借助贪心思想优化。

  1. 如果是0~9的话返回其本身,也就是不需要任何操作
  2. 如果是10~99,我们可以判断十位数字与个位数字的大小,比如73,我们需要做的操作就是7--,然后3变成9,结果为69
  3. 对于三位数及以上数字,可以从后两位开始判断,将其变为单调递增数字(局部最优),再逐渐判断更高一位的数字,最终数字整体变成单调递增数字(全局最优)。

基于以上思路,我们可以发现从后向前遍历数字更适合。这里还有一个小技巧:可以将数字转换成字符串,这样可以轻松获得每一位上的数字。 尽管这样增加了空间复杂度,但是代码更好写了。

代码如下:

class Solution {
public:int monotoneIncreasingDigits(int n) {string s = to_string(n);//字符串更方便操作每一位上的数字//用flag标记从哪个位置之后全赋值为9int flag = s.size();for (int i = s.size() - 1; i > 0; i--) {if (s[i - 1] > s[i]) {flag = i;s[i - 1]--;}}for (int i = flag; i < s.size(); i++) {s[i] = '9';}return stoi(s);}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

Leetcode 968.监控二叉树

题目链接:Leetcode 968.监控二叉树
题目描述: 给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象

计算监控树的所有节点所需的最小摄像头数量。

思路: 本题可以利用贪心思想,由于二叉树自上向下的节点个数是以指数级别增长,也就是说我们需要尽可能的让摄像头向上放而不聚集在叶子节点,这样可以节省大量摄像头数量,对应的我们需要利用二叉树的后序遍历,只有这样才是从下向上的判断是否需要添加摄像头。

代码如下:

class Solution {
public:int result; //统计摄像头数量// 0代表无覆盖,1代表摄像头,2代表有覆盖int traversal(TreeNode* cur) {//空节点,假设为有覆盖if (cur == nullptr)return 2;int left = traversal(cur->left);int right = traversal(cur->right);//(1)左右孩子都为2,则父节点为0if (left == 2 && right == 2)return 0;//(2)左右孩子至少有一个为0,则父节点为1// 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)左右孩子至少有一个为1,则父节点为2if (left == 1 || right == 1)return 2;//所有情况已经讨论结束,但是没有这段代码leetcode编译不过return -1;}int minCameraCover(TreeNode* root) {result = 0;//不要漏掉这里:(4)回溯到最后可能根节点未被覆盖if (traversal(root) == 0)result++;return result;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

这道题官方题解是动态规划,代码执行的行为类似,不过我感觉还是这种分类讨论+贪心的方法好理解。


总结: 贪心类题目多积累吧,遇到新题目没思路确实不好搞。

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

这篇关于代码随想录算法训练营第37天| Leetcode 738.单调递增的数字、968.监控二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737476

相关文章

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN