代码随想录训练营第三十七天|738.单调递增的数字、968.监控二叉树

news/2024/10/18 0:26:59/

738.单调递增的数字

链接:LeetCode738.单调递增的数字

class Solution {
public:int monotoneIncreasingDigits(int n) {string str = to_string(n);for(int i=str.size()-2;i>=0;--i){if(str[i]>str[i+1]) {--str[i];for(int s=i+1;s<str.size()&&str[s]!='9';++s) str[s]='9';}}n = stoi(str);return n;}
};

为了方便遍历每一位上的数字,将所给数字转变为字符串。从头到尾遍历该字符串或者从尾到头遍历该字符串都是可以的。本解法采用的是从尾到头遍历该字符串。本题要求的是找出最大的满足条件的数字。9是所有单位数字中最大的值,所以每当遇到str[i]>str[i+1]时,就先将str[i]减一,之后将i之后(不包括i)位置的数字变成‘9’。最后将字符串转变为整数。

968.监控二叉树

链接:968.监控二叉树

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int minCameraCover(TreeNode* root) {if(getnums(root)==0) ++ans;return ans;}
private:/*0:无覆盖1:有摄像头2:有覆盖*/int ans=0;int getnums(TreeNode *cur){//递归终止条件if(!cur) return 2;int left = getnums(cur->left);int right = getnums(cur->right);if(left==2&&right==2) return 0;//情况一if(left==0 || right==0) {++ans;return 1;}//情况二if(left==1 || right==1) return 2;//情况三return -1;}
};

代码随想录思路讲解
摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费一层的覆盖。把摄像头放在叶子节点的父节点的位置,才能充分利用摄像头的覆盖面积。

为什么不从头节点开始看起呢?因为头节点不放摄像头可以省下一个摄像头,叶子节点不放摄像头可以省下指数级别的摄像头。

所以从下往上看,局部最优:让叶子节点的父节点安装摄像头,所用摄像头最少;整体最优:全部摄像头数量所用最少。

大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头节点。

首先确定遍历顺序。
使用后序遍历,可以在回溯的过程中从下到上进行推导。
如何隔两个节点放一个摄像头。
首先看看每个节点可能有几种状态并用数字表示:

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

那么空节点是哪一种状态呢?
为了让摄像头数量最少,尽量让叶子节点的父节点安装摄像头,这样才能使摄像头的数量最少。空节点如果是无覆盖或者有摄像头的状态,都不用在叶子节点的父节点安装摄像头,所以空节点只能是有覆盖2的状态。

主要有以下四种情况:

  • 情况一:左右节点都有覆盖。那么父节点的状态为无覆盖。

  • 情况二:左右节点至少有一个无覆盖的。父节点应该安装摄像头。
    1.left == 0 && right == 0左右节点无覆盖
    2.left == 0 && right == 1左节点无覆盖右节点有摄像头
    3.left == 0 && right==2左节点无覆盖右节点有覆盖
    4.left == 1 && right == 0左节点有摄像头右节点无覆盖
    5.left == 2 && right == 0左节点有覆盖右节点无覆盖

  • 左右节点至少一个有摄像头。父节点的状态为有覆盖。
    1.left == 1 && right == 1左右节点都有摄像头。
    2.left == 1 && right ==2左节点有摄像头右节点有覆盖
    3.left == 2 && right == 1左节点有覆盖右节点有摄像头。

  • 单独观察头节点的情况。(因为不论头节点是什么状态,都会在遍历到头节点的时候退出程序,如果头节点没有被覆盖摄像头的数量不会加一。 另外一种比较方便的操作就是设置一个虚拟头节点,这样就不会遗漏头节点的状态。)


http://www.ppmy.cn/news/411542.html

相关文章

bcm43142无线网卡驱动

最近将系统切换到linux&#xff0c;选用了opensuse安装后&#xff0c;无线网卡无法驱动&#xff0c; lspci得到信息如下&#xff1a; 01:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Sun PRO [Radeon HD 8570A/8570M] (rev ff) 02:00.0 Ethernet contr…

关于安装dell7820台式机win7的过程,一把辛酸泪

今天郁闷的事&#xff0c;电脑崩了&#xff0c;我要重新安装操作系统&#xff0c;翻看很早之前写的内容&#xff0c;里面有部分内容有借鉴网上教程&#xff0c;但是主要时间比较久了&#xff0c;我找不到相关链接了&#xff0c;如果有知道的&#xff0c;告诉我下&#xff0c;不…

win7系统下 OpenGL 不能正常显示解决方法

这几天想看看OpenGL&#xff0c;按照网上介绍在win7的vs2008上使用glut插件。安装完成glut插件后&#xff0c;程序能编译通过&#xff0c;但是运行时&#xff0c;glut窗口要么是白色&#xff0c;要么卡在那里&#xff0c;不正常。 本来以为是win7不兼容glut插件。今天无意中在…

Linux CentOS 7 安装mongoDB

安装之前准备工作 环境说明&#xff1a; 1系统虚拟机信息&#xff1a;CentOS7 X86_64位&#xff1b; 2软件及版本&#xff1a;mongodb-linux-x86_64-3.6.3.tgz&#xff1b;Xshell工具 MongoDB 提供了 linux 各发行版本 64 位的安装包&#xff0c;你可以在官网下载安装包&am…

centos7 安装达梦8

1、 服务器信息 系统&#xff1a;centos7 CPU架构&#xff1a;x86 内存&#xff1a;8g 硬盘&#xff1a;70G 2、安装文档 2.1 硬件环境确定 _参考文档&#xff1a; _https://eco.dameng.com/document/dm/zh-cn/ops/installation-preliminary.html 虚拟机安装时建议不要最小…

CentOS 7+linux+mongodb安装及配置

一&#xff0c;安装centOS7&#xff0c;创建虚拟机 首先先安装VMware Workstation&#xff0c;我这边使用了中文的 文件-新建虚拟机 下一步后选择系统镜像&#xff0c;需要自行准备好哈 继续下一步&#xff0c;自己选择安装位置&#xff0c;最小需要20G&#xff0c; 地址配好…

centos7下部署dm8数据库(详细)

下载数据库准备工作 百度链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GG3-cWQevq6z-QbnJT1aqA 提取码&#xff1a;x3vq 1.安装前准备 新建dmdba用户与dinstall用户组 ①新建用户所在组&#xff0c;命令如下&#xff1a; [rootlocalhost ~]# groupadd di…

MongoDB:CentOS7安装MongoDB

安装MongoDB # 安装MongoDB cd /usr/local/ tar -xzvf mongodb-linux-x86_64-rhel70-6.0.2.tgz mv mongodb-linux-x86_64-rhel70-6.0.2/ mongodb-6.0.2/# 创建软链接 ln -s /usr/local/mongodb-6.0.2/bin/mongod /usr/local/bin/mongodMongoDB默认会将数据文件放在/data/db目录…