代码随想录Day37 | 738.单调递增的数字 968.监控二叉树

代码随想录Day37 | 738.单调递增的数字 968.监控二叉树

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

738.单调递增的数字

文档讲解:代码随想录
视频讲解: 贪心算法,思路不难想,但代码不好写!LeetCode:738.单调自增的数字
状态

本题可以通过比较低位与高位,如果低位比高位小,则变为9,同时比较高位的高位,如果高位比高位的高位大,那么就–。遍历完一次后,再从高位向低位遍历,如果高位比低位大,那么修改低位的值为高位的值

//统计每个位的字符
//然后按个位 十位这样组成一个数组
//如果i<i+1那么将nums[i]变为9
//接着比较i+1>=i+2 或者 i+1是否是最后一个 nums[i+1] -1
//最后在从右向左遍历,如果后遍历比前遍历的小则修改
class Solution {
public:int monotoneIncreasingDigits(int n) {if(n ==0) return 0;vector<int> check;while(n){int temp = n%10;check.push_back(temp);n = n/10;}for(int i = 0;i<check.size()-1;i++){if(check[i]<check[i+1]){check[i]=9;if(i+1 == check.size()-1 || (i+2<check.size() && check[i+1]>=check[i+2])){check[i+1]--;}}}int res = 0;for(int i = check.size()-1;i>0;i--){if(check[i-1]< check[i]){check[i-1] = check[i];}res *= 10;res += check[i];}res *= 10;res += check[0];return res;}
};

代码随想录中给出了另外一种方法,那就是如果遇到低位比高位大的情况,先将低位–,然后记录此时高位的位置。待一次遍历结束后,从记录的位置向高位赋值9。

//统计每个位的字符
//然后按个位 十位这样组成一个数组
//如果i<i+1那么将nums[i]变为9
//接着比较i+1>=i+2 或者 i+1是否是最后一个 nums[i+1] -1
//最后在从右向左遍历,如果后遍历比前遍历的小则修改
class Solution {
public:int monotoneIncreasingDigits(int n) {if(n ==0) return 0;vector<int> check;while(n){int temp = n%10;check.push_back(temp);n = n/10;}//记录当前的第一个需要更改的位置int flag = -1;for(int i = 0;i<check.size()-1;i++){if(check[i+1] > check[i]){flag = i;check[i+1]--;}}for(int i = flag;i>=0;i--){check[i] = 9;}int res = 0;for(int i = check.size()-1;i>=0;i--){res *= 10;res += check[i];}return res;}
};

968.监控二叉树

文档讲解:代码随想录
视频讲解: 贪心算法,二叉树与贪心的结合,有点难… LeetCode:968.监督二叉树
状态

本题首先需要考虑的是摄像头该如何放置,为了使得摄像头最少,那么在叶子节点上就不应该放置摄像头,而应当在叶子节点的父节点上放置。
接着就是采用后序遍历,应为我们要根据子结点的放置来判断中间节点的放置情况。
对于一个节点来说总共可能出现3种情况

没有被覆盖 – 0
作为摄像头节点 – 1
作为被覆盖节点 – 2

现在来考虑返回值,当我们遇见空节点时,空节点只能作为被覆盖节点即返回2,因为首先空节点不能作为摄像头节点,其次如果其没有被覆盖,那么叶子节点一定有摄像头

if(root == nullptr) return 2;

最后就是单层逻辑的处理

  • 如果左右节点都是被覆盖节点 返回值为2
    那么此时的中间节点应当为0,
  • 如果左右节点至少有一个无覆盖的情况 返回值为0
    那么中间节点应当放置一个摄像头 应当为1
    在这里插入图片描述
  • 左右节点至少有一个摄像头, 即有一个返回值为1
    那么 中间节点应当为2
    在这里插入图片描述- 对根节点需要单独判断
    如果根节点没有被覆盖,那么就需要再增加一个摄像头。
/*** 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 {
private:int res = 0;
public:int SetCamera(TreeNode* root){//空节点if(root == nullptr) return 2;int left = SetCamera(root->left);int right = SetCamera(root->right);//如果左右节点都是 2if(left == 2 && right ==2){return 0;}//如果左右节点有一个是没有被覆盖if(left == 0|| right == 0){res++;return 1;}//如果左右节点有一个是摄像头,返回1if(left == 1 || right == 1){return 2;}return -1;}
public:int minCameraCover(TreeNode* root) {if(SetCamera(root) == 0){res++;}return res;}
};

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

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

相关文章

QWT开源库使用

源代码地址&#xff1a;Qwt Users Guide: Qwt - Qt Widgets for Technical Applications Qwt库包含GUI组件和实用程序类&#xff0c;它们主要用于具有技术背景的程序。除了2D图的框架外&#xff0c;它还提供刻度&#xff0c;滑块&#xff0c;刻度盘&#xff0c;指南针&#xf…

oracle数据回滚导致业务性能问题排查

问题描述 数据库出现性能问题&#xff0c;应用响应超时持续长达10多分钟。由于每秒有大量insert&#xff0c;业务实时敏感性较高&#xff0c;而且每天凌晨会对前一天的数据进行归档也就是insert进历史表格&#xff0c;原表数据会进行delete清理&#xff08;数据量每天300W左右…

C语言指针学习(1)

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…

11. UE5 RPG使用GameplayEffect修改角色属性(二)

上一篇写了一下GameplayEffect的基础操作&#xff0c;这一篇进阶一下&#xff0c;讲解一下GameplayEffect堆叠功能&#xff0c;以及能够基于这个堆叠能够实现一些怎样的效果。 经过几天的查看&#xff0c;发现新版的更新的真不错&#xff0c;而且最上面竟然直接显示编译的错误…

【SpringBoot】SpringBoot的自动配置原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 自动配置 啥叫自动配置呢&#xff1f;简单说就是springboot根据我们开发者的行为猜测你要做什么事情&#xff0c;然后把你要用的bean都给你准备…

vue3使用is动态切换组件报错Vue received a Component which was made a reactive object.

vue3使用is动态切换组件&#xff0c;activeComponent用ref定义报错 Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with markRaw or using shallowRef ins…

【Linux】初始进程地址空间

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、再谈fork二、程序地址空间2.1代码验证 三、虚拟地址&am…

数据结构+算法(第05篇):数组和链表

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

前端工程化之:webpack1-8(loader)

一、loader webpack 做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定的文件中。 更多的功能需要借助 webpack loaders (加载器)和 webpack plugins (插件)完成。 webpack loader &#xff1a; loader 本质上是…

数据结构哈希表(散列) 之Hash

声明: 此文章仅限于记录学习之用 , 受限于自身水平和理解能力 , 因此结论可能是不正确的. 如果您需要学习,建议参考其他文章 看了下网上一些大佬的教程, 写的云山雾绕的. 简单总结下吧. 以言简意赅为主. 介绍下hash hash 就是把任意输入通过算法生成一个int值. 这个值就是放…

如何使用 Supabase Auth 在您的应用程序中设置身份验证

在本文中&#xff0c;您将学习基本的关键概念&#xff0c;这些概念将帮助您掌握身份验证和授权的工作原理。 您将首先了解什么是身份验证和授权&#xff0c;然后了解如何使用 Supabase auth 在应用程序中实现身份验证。 &#xff08;本文内容参考&#xff1a;java567.com&…

Spark入门01-Spark简介

1 Spark是什么 Spark是用于大规模数据处理的统一分析引擎。对任意类型的数据进行自定义计算。 可以计算&#xff1a;结构化、非结构化&#xff0c;半结构化的数据结构&#xff0c;支持使用Python&#xff0c;Java&#xff0c;Scala、Sql语言开发应用程序计算数据。 计算框架&a…