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

news2024/11/25 6:36:45

一、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) {//地位数字全部置为9
                    arr[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;//如果为空节点,返回状态1
        int 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.coloradmin.cn/o/1217481.html

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

相关文章

Backblaze 2023 Q3硬盘故障质量报告解读

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。2023年度之前发布的两次报告&#xff0c;请参考&#xff1a; Backblaze发布2…

Vue-Pinia

目录 Pinia状态管理库 使用步骤 1、安装Pinia 2、在vue应用实例中使用pinia 3、在src/stores/token.js中定义stores 4、在组件中使用store axios请求拦截器 代码实现 Pinia状态管理库 Pinia是Vue的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态 一般在登录时…

第一百七十五回 如何创建放射形状渐变背景

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在 上一章回中介绍了"如何创建扇形渐变背景"相关的内容&#xff0c;本章回中将介绍" 如何创建放射形状渐变背景"。闲话休提&#xff0c;让我们一起Talk Flutter吧…

根据店铺ID或店铺昵称或店铺链接获取阿里巴巴店铺所有商品数据接口|阿里巴巴店铺整店商品数据接口|阿里巴巴API接口

阿里巴巴店铺所有商品数据接口是阿里巴巴开放平台提供的API接口之一&#xff0c;它可以帮助开发者获取到店铺内所有商品的信息&#xff0c;包括商品的ID、标题、价格、图片、链接等。通过该接口&#xff0c;开发者可以快速地获取到大量的商品数据&#xff0c;并进行进一步的数据…

数字化时代,数据就是资产

2011年&#xff0c;麦肯锡发布报告&#xff0c;认为“大数据Big Data已成为当今竞争、创新、生产效率提升的关键基础”。一时间&#xff0c;大数据&#xff0c;成为业内热点。数据&#xff0c;大家都懂&#xff1b;大&#xff0c;有什么区别&#xff1f; 而不管大的是什么&…

centos的root密码忘记或失效的解决办法

目录 前言1 单机维护模式2 利用具有管理员权限的用户切换到root用户3 救援模式 前言 在Linux系统中&#xff0c;root用户是最高权限的用户&#xff0c;可以执行任何命令和操作。但是&#xff0c;如果我们忘记了root用户的密码&#xff0c;或者需要修改root用户的密码&#xff…

STM32中断看这一篇就够了

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1. 前言…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…

CUDA学习笔记8——GPU硬件资源

简单来说就是为了充分利用GPU&#xff0c;不要让分出去的CUDA核心摸鱼闲置&#xff1b;GPU每次干活&#xff0c;都是以最小的组分配的&#xff0c;因此分派任务的时候就尽量充分发挥每个小组里CUDA核心的作用。这里的每个小组就是一个SM&#xff08;stream multi-processor&…

所见即所得的动画效果:Animate.css

我们可以在集成Animate.css来改善界面的用户体验&#xff0c;省掉大量手写css动画的时间。 官网&#xff1a;Animate.css 使用 1、安装依赖 npm install animate.css --save2、引入依赖 import animate.css;3、在项目中使用 在class类名上animate__animated是必须的&#x…

hash路由模式

hash模式 hash模式是一种把前端路由的路径用井号 # 拼接在浏览器 URL 后面的模式。 一个完整的 URL 包括&#xff1a;协议、域名、端口、虚拟目录、文件名、参数、锚。 https://www.wangyuegyq.top/utils/index.html?name123&phone123#home协议&#xff1a;https域名&am…

3. hdfs概述与高可用原理

简述 HDFS&#xff08;Hadoop Distributed File System&#xff09;是一种Hadoop分布式文件系统&#xff0c;具备高度容错特性&#xff0c;支持高吞吐量数据访问&#xff0c;可以在处理海量数据&#xff08;TB或PB级别以上&#xff09;的同时最大可能的降低成本。 HDFS适用于…

大数据-之LibrA数据库系统告警处理(ALM-12049 网络读吞吐率超过阈值)

告警解释 系统每30秒周期性检测网络读吞吐率&#xff0c;并把实际吞吐率和阈值&#xff08;系统默认阈值80%&#xff09;进行比较&#xff0c;当检测到网络读吞吐率连续多次&#xff08;默认值为5&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置 >…

迈特优×实在RPA丨每年节省人天800+,企业自动化前后的区别如此大?

迈特优品牌设立于2015年&#xff0c;是一家集设计、生产、销售为一体的新电商企业&#xff0c;旗下拥有天猫、拼多多、唯品会等平台10余家店铺&#xff0c;在天猫男装品类排名前十&#xff0c;男装各个类目均有排名前五的商品&#xff0c;每年开发新品超过1000款。 为优化企业…

基于Vue+SpringBoot的无代码动态表单系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

μC/OS-II---进程间通信方式

目录 信号量&#xff08; Semaphores &#xff09;- 用于最基本的互斥、同步操作互斥信号量&#xff08;Mutual Exclusion Semaphores &#xff09;-专门用于互斥消息队列&#xff08; Message Queues &#xff09;- 用于消息通信消息邮箱&#xff08;Message Box&#xff09; …

Latex如何消除并自定义算法标识

正常&#xff1a; 修改后&#xff1a; 正常代码&#xff1a; \documentclass{article} \usepackage[ruled]{algorithm2e} \begin{document} \begin{algorithm} \caption{Hi} My name is XXX. \end{algorithm} \end{document}修改后代码&#xff1a; \documentclass{articl…

遥感领域最热门的研究主题介绍

遥感是有效地直接从地球收集数据的最重要技术之一。由于生态信息科学的进步&#xff0c;遥感技术在日常生活的多个研究方面变得非常有价值&#xff0c;其中包括大气物理学、生态学、土壤和水污染、土壤科学、地质学、火山爆发和地球演化。以下是遥感领域的主要趋势研究主题&…

山西电力市场日前价格预测【2023-11-17】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-17&#xff09;山西电力市场全天平均日前电价为156.81元/MWh。其中&#xff0c;最高日前电价为457.16元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Java远程操作Linux服务器命令

Java可以通过SSH协议远程连接Linux服务器&#xff0c;然后使用JSch库或者Apache Commons Net库来执行远程Linux命令。以下是一个使用JSch库的示例代码&#xff1a; import com.jcraft.jsch.*;public class RemoteCommandExecutor {private String host;private String user;pr…