代码随想录训练营Day28:贪心算法06

1.738单调递增的数字

贪心策略:如果strNum[i]<strNum[i-1]那么strNum[i] = '9',strNum[i-1]--;//比如87对应的最大的单调递增的就是79.

具体实现:

  1. 对于遇到小于的情况:如果strNum[i]<strNum[i-1]那么strNum[i] = '9',strNum[i-1]--;
  2. 遍历顺序必须得是一个反向遍历,这样才能保证找到最高位数需要进行改变的地方。(如果从左往右进行便利的话,会出现一种这样的情况,例如N = 999998前面的都相等,那么需要改变的是最右侧那个位置,明显不符合,所以要从右往左进行遍历)
  3. 使用flag来确定需要变成9的最左侧的位置
class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N);// flag用来标记赋值9从哪里开始// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i] ) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9';}return stoi(strNum);}
};

2.968监控二叉树

贪心策略:一个摄像头能够监控到更多的节点。

具体实现:

  • 首先要确定的就是遍历顺序,是自顶向下还是自底向上的遍历顺序如果是自顶向下的话,那么就是判断父节点是否被覆盖,此时需要设置的节点就是:2,3,8,9,10,11,12,13,14,15.如果是自底向上的情况那么就是判断左右孩子节点是否被覆盖,此时需要设置的节点就是:4,5,6,7,1.所以确定的遍历顺序就是自底向上的情况。
  • 再确定就是状态:分为三种状态:0:未被覆盖,1:存放摄像头,2:被覆盖三种状态。
  • 对于空节点的处理:如果空节点的状态为0,那么叶子结点就需要设置为存放摄像头的,明显是不符合的,当空节点的状态为2的时候,此时叶子结点就不需要设置摄像头了,只需要在叶子结点的上方设置摄像头即可,所以空节点设置为2.
  • 当前节点为2(被覆盖):左右孩子中至少有一个是1(设置为节点),且左右孩子不能为0。
  • 当前节点为1(设置摄像头):左右孩子中至少有一个为0(未被覆盖)。
  • 当前节点为0(为被覆盖):左右孩子全都是2(被覆盖状态)。
  • 对于最后根节点的处理:因为会出现一种情况就是如果23全都是被覆盖,那么设置的1就是为未覆盖状态(0)退出,但是不符合实际,此时需要将其变成设置摄像头(2),所以最后还需要在主函数里面判断返回值是否为0。

/*** 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://节点分三种情况://0:没覆盖;1:该节点存放摄像头;2:该节点被覆盖//当节点为空的时候设置为被覆盖int result;int traversal(TreeNode* cur){if(cur == nullptr) return 2;int left = traversal(cur->left);int right = traversal(cur->right);//该节点为设置为没覆盖:左右节点都被覆盖if(left == 2&&right == 2)return 0;//该节点设置为监控if(left == 0||right == 0){result++;return 1;}//该节点设置为被覆盖//1.left =1,right =1;if(left == 1||right ==1){return 2;}return -1;//代表的知识一个完整性}int minCameraCover(TreeNode* root) {result = 0;if(traversal(root) == 0){//对于最后一个根节点的处理,如果此时设置为0,代表未被覆盖,需要重新设置为1,即result++;result++;}return result;}
};

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

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

相关文章

【线性代数】英语版听课笔记

线性代数 - 北京航天航空大学&#xff08;英文版&#xff09;_哔哩哔哩_bilibili 39.concept of vector space in this lecture we will studyvector space&#xff0c; the concept of basis dimension and coordinates 向量空间的维数&#xff1a;向量空间的基底所含向量的…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络&#xff08;名称随便一个&#xff09; 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关&#xff0c;等下要用&#xff1b; 5.打开虚拟机&#xff0c;右上角&#xff0c;下标点…

C++青少年简明教程:C++中的常量、变量、表达式和语句

C青少年简明教程&#xff1a;C中的常量、变量、表达式和语句 在C编程中&#xff0c;常量、变量、表达式和语句是基本的编程概念。 常量&#xff08;Constants&#xff09;&#xff1a;在程序中具有固定值的数据称为常量。常量可以是字面值&#xff0c;如整数、浮点数、字符或…

mamba-ssm安装卡着不动

项目中用到Mamba的小伙伴&#xff0c;causal_conv1d和 mamba-ssm两个包&#xff0c;但是会卡在Building wheel for mamba-ssm (setup.py) &#xff1a; 为了探究卡在了building的哪一步&#xff0c;加入–verbose进行显示&#xff1a; pip install mamba-ssm --no-cache-dir -…

初探 JUC 并发编程:读写锁 ReentrantReadWriteLock 原理(8000 字源码详解)

本文中会涉及到一些前面 ReentrantLock 中学到的内容&#xff0c;先去阅读一下我关于独占锁 ReentrantLock 的源码解析阅读起来会更加清晰。 初探 JUC 并发编程&#xff1a;独占锁 ReentrantLock 底层源码解析 6.4&#xff09;读写锁 ReentrantReadWriteLock 原理 前面提到的 R…

JUC下CountDownLatch详解

详细介绍 CountDownLatch是Java并发包java.util.concurrent中提供的一个同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。这个工具类基于一个计数器&#xff0c;计数器的初始值可以由构造函数设定。线程调用countDown()方法会将计数器减1&#x…

drawio 网页版二次开发(2):开始修改代码

目录 一 说明 二 打开开发环境 1. 代码调整 2. 修改访问链接 3. 注意 三 部分功能的代码汇总 1. 保存功能 2. 菜单栏折叠按钮功能 3. 顶部菜单栏 4.在顶部菜单栏中的【文件】菜单中新增选项 &#xff08;1&#xff09; 方法一&#xff1a;单独增加 &#xff08;…

C++动态内存管理:与C语言动态内存管理的差异之争

当你改错一行代码的时候&#xff1a; 当你想要重构别人的代码时&#xff1a; 目录 前言 一、C/C的内存分布 二、C/C语言中的动态内存管理 三、new与delete的实现原理 总结&#xff1a; 前言 在C中&#xff0c;内存管理是一个至关重要的主题。正确地管理内存可以避免内存泄…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

百面算法工程师 | 模型评价指标及优化策略

本文给大家带来的百面算法工程师是深度学习模型评价指标的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的评价方案&#xff0c;并提供参考的回答及其理论基础&…

程序的环境和预处理#define #ifdefine

文章目录 预编译 预处理做的事情把#include<>里面的内容执行了注释删除&#xff0c;使用空格替换注释define 把符号统统替换为值 编译阶段做的事情链接做的事情运行环境预处理(预处理)详解预定义符号__FILE____LINE____DATE__ __TIME__写日志文件__FUNCTION__ #define预处…

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09; 文章目录 Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09;前言一、垂直鉴权是什么&#xff1f;二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…