LeetCode算法题解|LeetCode738. 单调递增的数字、LeetCode968. 监控二叉树

一、LeetCode738. 单调递增的数字

题目链接:738. 单调递增的数字
题目描述:

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

提示:

  • 0 <= n <= 109
算法分析:

将这个数的每位数字放在一个数组中。

然后按照从低位到高位的顺序遍历数组,如果低位的数字小于高位的数字,那么就不满足递增的规则,所以向高位取数(高位减一),然后所有低位的数字全部置于9,这样才能尽可能取到一个大的数字,如果此时高位小于0了,那么向更高的位取数,直到最高位结束。

局部最优:从低位到高位逐步处理使其符合递增的顺序。

全局最优:整体符合递增。

代码如下:

class Solution {public int monotoneIncreasingDigits(int n) {int[] arr = new int[10];//用一个数组来存放每个位数上的数字int t = n;int len = 0;//记录位数的个数while(t != 0) {//将位数上的数字倒放在数组arr[len++] = t % 10;t /= 10;}for(int i = 1; i < len; i++) {//从左到右遍历数组,相当于从低位往高位遍历if(arr[i] > arr[i - 1]) {//如果相邻低位数字小于高位数字,就不符合单调递增的规则,需要进行进一步处理int j = i - 1;while(j >= 0) {//地位数字全部置为9arr[j--] = 9;}//高位的数字减一arr[i]--;j = i;while(arr[j] < 0) {//如果高位的数字小于0了,那么向更高位的取数if(j + 1 < len) {arr[j] = 9;arr[j + 1]--;j++;}}}}int sum = 0;for(int i = len - 1; i >= 0; i--) {//将数组转化成数字返回if(arr[i] == 0) continue;sum = sum * 10 + arr[i];}return sum;}
}

二、LeetCode968. 监控二叉树

题目链接:968. 监控二叉树
题目描述:

给定一个二叉树,我们在树的节点上安装摄像头。

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

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

示例 1:

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

示例 2:

输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。


提示:

  1. 给定树的节点数的范围是 [1, 1000]
  2. 每个节点的值都是 0。
算法分析:

叶子节点上尽量不要放摄像头,因为这样会浪费下一层的覆盖。

所以我们要从叶子节点的父节点依次往上在合适的位置放摄像头,这就要用到二叉树的后序遍历了,因为我们要先处理子节点再处理父节点。

首先对于每一个节点的状态有三种情况:有摄像头、无摄像头(被摄像头覆盖、没被摄像头覆盖),我们可以用0表示没被摄像头覆盖的情况,用1表示被摄像头覆盖的情况,用2表示有摄像头。

于是对于每一个节点的处理,我们只需要判断其左右子节点的状态就可以了。

如果左子节点或右子节点当中至少有一个是0(没有被摄像头覆盖)状态,那么我们就必须要在当前节点上放置摄像头,只有这样才能覆盖到子节点,将子节点从0变成1。

如果左右子节点当中至少有一个是2(在没有0状态的前提下),也就是有摄像头,那么此时当前节点是会被摄像头覆盖的,所以当前节点的状态就是1。

如果做有子节点的状态都是1,那么当前节点没有被摄像头覆盖,状态为0。

特别的,因为空子节点的状态是不能影响到父节点的状态的,所以我们将空的节点表示成1(状态0、状态2都会影响父节点的状态,所以按照被摄像头覆盖处理,也就是1)。

具体代码如下:

class Solution {int count;//记录摄像头个数public int backTravel(TreeNode root) {//递归返回的是当前节点的状态if(root == null) return 1;//如果为空节点,返回状态1int left = backTravel(root.left);//记录左子节点的状态int right = backTravel(root.right);//记录右子节点的状态if(left == 0 || right == 0) {//如果左右子节点中至少有一个状态为0(没被摄像头覆盖),将当前节点放置摄像头count++;return 2;}else if(left == 2 || right == 2) return 1;//在左右子节点状态都不为0的前提下,如果其中至少有一个放置了摄像头,那么当前节点的状态就是1(被摄像头覆盖)else return 0;//此时只剩下一种情况,左右子节点的状态都是1,对当前节点产生不了影响,所以当前节点的状态是0(没被摄像头覆盖)}public int minCameraCover(TreeNode root) {count = 0;if(backTravel(root) == 0) count++;//如果头节的状态是0,也要在头节点放置一个摄像头return count;}
}

总结

第二题比较难,尤其是用三个状态描述每个节点的状态这个方法不容易想到。

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

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

相关文章

milvus数据库-连接

Milvus 支持 19530 和 9091 两个端口&#xff1a; 端口 19530 用于 gRPC 和 RESTful API。 这是您使用不同 Milvus SDK 或 HTTP 客户端连接到 Milvus 服务器时的默认端口。 端口 9091 用于 Kubernetes 内的指标收集、pprof 分析和运行状况探测。 它用作管理端口。 1.连接到数…

新晋“学霸”夸克大模型拿下C-Eval和CMMLU双榜第一

11月16日&#xff0c;根据最新成绩&#xff0c;千亿级参数的夸克大模型登顶C-Eval和CMMLU两大权威评测榜单&#xff0c;多项性能优于GPT-4。在国内大模型赛道火热的当下&#xff0c;夸克自研大模型凭借过硬的研发能力及数据、行业、平台等优势成为新晋“学霸”。 作为国内最权…

深度学习损失函数

Loss 是深度学习算法中重要的一部分&#xff0c;它的主要功能是评价网络预测的准确性和指导权重更新。合适 Loss 可以让网络收敛更快&#xff0c;预测更准。这个项目介绍了损失函数的基本概念以及7种常用损失函数的形式&#xff0c;性质&#xff0c;参数&#xff0c;使用场景及…

[C++]:8.C++ STL引入+string(介绍)

C STL引入string(介绍&#xff09; 一.STL引入&#xff1a;1.什么是STL2.什么是STL的版本&#xff1a;2-1&#xff1a;原始版本&#xff1a;2-2&#xff1a;P. J 版本&#xff1a;2-3&#xff1a;RW 版本&#xff1a;2-4&#xff1a;SGL版本&#xff1a; 3.STL 的六大组件&…

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求&#xff0c;要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍&#xff0c;每个项目的需求又都有点儿不一样&#xff0c;迭代了很多版&#xff0c;所以抽时间把这个功能封装了…

【Electron】electron-builder打包失败问题记录

文章目录 yarn下载的包不支持require()winCodeSign-2.6.0.7z下载失败nsis-3.0.4.1.7z下载失败待补充... yarn下载的包不支持require() 报错内容&#xff1a; var stringWidth require(string-width)^ Error [ERR_REQUIRE_ESM]: require() of ES Module /stuff/node_modules/…

12 Go的接口

概述 在上一节的内容中&#xff0c;我们介绍了Go的作用域&#xff0c;包括&#xff1a;局部作用域、全局作用域、命名空间作用域等。在本节中&#xff0c;我们将介绍Go的接口。Go语言中的接口是一种类型&#xff0c;它定义了一组函数的集合。接口是一种抽象的描述&#xff0c;它…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

葡萄酒质量预测python

葡萄酒质量预测是一个经典的机器学习问题&#xff0c;通常使用基于统计模型的机器学习方法来解决。在Python中&#xff0c;我们可以使用各种机器学习库&#xff0c;如scikit-learn&#xff0c;来构建和训练模型。 以下是一个简单的示例&#xff0c;展示如何使用scikit-learn库…

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

基础框架代码解释

自定义的&#xff0c;用法就是等于号后面的 out是自己定义的层啊 nn.ReLU()是构造了一个ReLU对象&#xff0c;并不是函数调用&#xff0c;而F.ReLU()是函数调用 这里大佬能说一下&#xff0c;为什么forward里面不能用nn.RELU()函数吗&#xff0c;我只知道是因为参数的问题&a…

智慧城市怎么实时监测内涝积水的发生及解决办法?

随着城市化进程步伐不断加快&#xff0c;城市内涝问题越来越受到人们的关注。内涝不仅不便于人们的生活&#xff0c;还可能危害城市之中的基础设施比如路面等。因此实时监测内涝积水的发生并采取有效的解决办法是市政府的紧急任务&#xff0c;同时解决城市内涝也利于城市生命线…

OpenCV中的像素重映射原理及实战分析

引言 映射是个数学术语&#xff0c;指两个元素的集之间元素相互“对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数。 基于此&#xff0c;部分映射就相当于部分函数&#xff0c;而完全映射相当于完全函数。 说的简单点…

【算法】算法题-20231117

这里写目录标题 一、搜索插入位置&#xff08;35&#xff09;二、字符串相乘&#xff08;43&#xff09;三、两个相同字符之间的最长子字符串&#xff08;1624&#xff09;四、给你一个 有效括号字符串 s&#xff0c;返回该字符串的 s 嵌套深度 一、搜索插入位置&#xff08;35…

linux高级篇基础理论二(详细文档、LAMP、SHELL、sed正则表达式)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

C#委托与事件

在C#中&#xff0c;委托&#xff08;Delegates&#xff09;和事件&#xff08;Events&#xff09;是用于实现事件驱动编程的关键组件。 委托&#xff08;Delegates&#xff09; 委托是一种特殊的类型&#xff0c;它定义了方法的签名&#xff08;即方法的返回类型和参数类型&a…

layui的layer.confirm获取按钮焦点

因为ayer.confirm的按钮并非采用button&#xff0c;而是a标签&#xff0c;所以获取按钮焦点获取不到&#xff0c;要采用别的方法&#xff0c;下面介绍在ie11中和ie8中不同的写法 在ie11中 layer.confirm(确定取消这个弹窗吗&#xff1f;,{btn: [确定, 取消],success:function…

海康Visionmaster-环境配置:VB.Net 二次开发环境配 置方法

Visual Basic 进行 VM 二次开发的环境配置分为三步。 第一步&#xff0c;使用 VS 新建一个框架为.NET Framework 4.6.1&#xff0c;平台去勾选首选 32 为的工程&#xff0c;重新生成解决方案&#xff0c;保证工程 Debug 下存在 exe 文件&#xff0c;最后关闭新建工程&#xff1…

按键精灵中的日志、分辨率、找色逻辑、线程

1. 开启输出日志 // 开启日志 Log.Open TracePrint "你好"TracePrint "世界"// 关闭日志 Log.Close // 输出日志 TracePrint GetTempDir()// 当前脚本第4行&#xff1a;你好 // 当前脚本第6行&#xff1a;世界2. 设置分辨率 在写脚本的时候&#xff0c…

【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚯蚓优化算法&#xff08;Earthworm Optimisation Algorithm, EOA&#xff09;是一种启发式算法&#xff0c;灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…