代码学习记录29----贪心最后一天

随想录日记part29

t i m e : time: time 2024.03.28



主要内容:今天是学习贪心算法最后一天,接下来是针对题目的讲解:1.单调递增的数字;2.监控二叉树; 3. 总结

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


Topic1单调递增的数字

题目:

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回小于或等于 n 的最大数字,且数字呈 单调递增 。

输入: n = 10 n = 10 n=10
输出: 9 9 9

思路:

思路简单直接看答案。

代码如下:

class Solution {public int monotoneIncreasingDigits(int n) {if (n >= 0 && n <= 9)return n;int count = wei(n);int[] nums = new int[count];int tem = n;for (int i = count - 1; i >= 0; i--) {nums[i] = tem % 10;tem = tem / 10;}int flag = count;for (int i = count - 1; i > 0; i--) {if (nums[i] < nums[i - 1]) {nums[i - 1]--;flag = i;}}for (int i = flag; i < count; i++) {nums[i] = 9;}int sum = 0;for (int i = 0; i < count; i++) {sum = sum * 10 + nums[i];}return sum;}private int wei(int n) {if (n < 10)return 1;int tem = n;int result = 0;while (tem != 0) {result++;tem = tem / 10;}return result;}
}

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)



Topic2监控二叉树

题目:

给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。
在这里插入图片描述

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

思路:

从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!局部最优推出全局最优,找不出反例,那么就按照贪心来!
大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。
此时这道题目还有两个难点:

  • 二叉树的遍历
  • 如何隔两个节点放一个摄像头

如何隔两个节点放一个摄像头:
每个节点可能有几种状态:有如下三种:

  • 该节点无覆盖
  • 本节点有摄像头
  • 本节点有覆盖

分别有三个数字来表示:
0:该节点无覆盖
1:本节点有摄像头
2:本节点有覆盖
递归的终止条件: 应该是遇到了空节点,此时应该返回2。
单层逻辑处理:
【情况1】:左右节点都有覆盖
左孩子有覆盖,右孩子有覆盖,那么此时中间节点应该就是无覆盖的状态了。
【情况2】:左右节点至少有一个无覆盖的情况
如果是以下情况,则中间节点(父节点)应该放摄像头:
left == 0 && right == 0 左右节点无覆盖
left == 1 && right == 0 左节点有摄像头,右节点无覆盖
left == 0 && right == 1 左节点有无覆盖,右节点摄像头
left == 0 && right == 2 左节点无覆盖,右节点覆盖
left == 2 && right == 0 左节点覆盖,右节点无覆盖
【情况3】:左右节点至少有一个有摄像头
如果是以下情况,其实就是 左右孩子节点有一个有摄像头了,那么其父节点就应该是2(覆盖的状态)
left == 1 && right == 2 左节点有摄像头,右节点有覆盖
left == 2 && right == 1 左节点有覆盖,右节点有摄像头
left == 1 && right == 1 左右节点都有摄像头
【情况4】:头结点没有覆盖
以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况

整体代码如下:

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {int result;public int minCameraCover(TreeNode root) {result = 0;int tem = reback(root);if (tem == 0)result++;return result;}private int reback(TreeNode root) {// 递归出口if (root == null)return 2;int left = reback(root.left);int right = reback(root.right);// 【情况1】:左右节点都有覆盖if (left == 2 && right == 2) {return 0;}// 【情况2】:左右节点至少有一个无覆盖的情况if (left == 0 || right == 0) {result++;return 1;}// 【情况3】:左右节点至少有一个有摄像头if (left == 1 || right == 1) {return 2;}return -1;}
}

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)



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

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

相关文章

sql造数据

造一行常量数据SQL select “col1”,“col2”,“col3” 造多行多列 select concat(AAA, :, "BBB", _PP, :, "XXXXX") as key1,concat({"Id":","12323213",","url":","http://helloworld.com/hello.…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展&#xff0c;通知中心架构作为一种关键的沟通工具&#xff0c;正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构&#xff1f; 通知中心架构是指通过集中管…

Git_常用命令+代码冲突解决方案

文章目录 基本命令的使用查看git的当前版本初始化配置设置用户名及邮箱设置仓库的认证方式查看当前配置 创建仓库从远程服务器克隆仓库创建本地仓库 添加和提交文件工作区域和文件状态工作区域文件状态 查看文件状态及分支信息查看暂存区的内容添加文件提交文件查看提交日志回退…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

ChatGLM3:AttributeError_ can‘t set attribute ‘eos_token‘

最近在微调 ChatGLM3-6b 时&#xff0c;训练好模型之后&#xff0c;调用inference_hf.py函数验证模型的时候报了如下错误&#xff0c;下面是解决方案。 我在训练时使用的是ptuning_v2.yaml配置文件&#xff0c;训练运行代码如下&#xff1a; CUDA_VISIBLE_DEVICES1 python fi…

webpack源码分析——makeCacheable函数和weakMap的缓存应用场景

一、makeCacheable 函数 函数功能 该函数是将一个不带缓存的函数 realFn 转换成一个带缓存的版本。这样可以提高性能&#xff0c;因为相同的输入值不需要每次都重新计算&#xff0c;而是可以从缓存中直接获取结果。 二、函数分析 使用 WeakMap 弱引用特性创建缓存 const cach…

LINUX交叉编译arm/aarch64简单脚本

代码文件是test.c 编译脚本 export ARCHaarch64# 这一句好像没有什么用 export CROSS_COMPILEaarch64-mix210-linux-export PATH$PATH:/opt/linux/x86-arm/aarch64-mix210-linux/binA_GCCaarch64-mix210-linux-g EXE_FILEtest ${A_GCC} \-o ${EXE_FILE} \test.cPATH中那个目录…

C语言面试高频考点

1. 封装函数实现strlen功能 #include <stdio.h>size_t MyStrlen(const char *pstr) {size_t cnt 0;while (*pstr ! \0){cnt;}return cnt; }int main(void) {char str[256] {0};size_t len 0;gets(str);len MyStrlen(str);printf("数组长度为&#xff1a;%ld\n&q…

3.Labview字符串与路径精讲(下) — 字符串及路径的使用

本章讲解labview中的字符串和路径具体实践用例&#xff0c;从前面板字符串属性到后面板字符串函数应用做出详细概述&#xff0c;通过本文的学习希望大家了解到字符串及路径在labview编程中的重要地位。 本系列文章为labview 从基础到强化到精通的学习文章&#xff0c;大家可以随…

Unity3d使用Jenkins自动化打包(Windows)(二)

文章目录 前言一、Unity工程准备二、Unity调取命令行实战一实战二实战三实战四实战五 总结 前言 自动化打包的价值在于让程序员更轻松地创建和管理构建工具链&#xff0c;提高编程效率&#xff0c;将繁杂的工作碎片化&#xff0c;变成人人&#xff08;游戏行业特指策划&#x…

装饰器模式:灵活增强功能的利器

在软件设计过程中&#xff0c;经常需要为对象增加新的功能或职责&#xff0c;而这些新增的功能可能并不适合直接添加到原有的类中&#xff0c;因为这样会破坏原有类的结构或增加其复杂性。此时&#xff0c;装饰器模式&#xff08;Decorator Pattern&#xff09;便派上了用场。装…

RegSeg 学习笔记(待完善)

论文阅读 解决的问题 引用别的论文的内容 可以用 controlf 寻找想要的内容 PPM 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC / SPPELAN &#xfffc; ASPP STDC&#xff1a;short-term dense concatenate module 和 DDRNet SE-ResNeXt …

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…

Linux中的vim/vi编辑器

VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器。 VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器&#xff0c;可以说是&#xff1a;编辑器之神。可以主动的以字体颜 色辨别语法的正确性&#xff0c;方便程序设计。VIM 与 VI 编辑器完全兼容。 一:三种…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

Unity AI Navigation自动寻路

目录 前言一、Unity中AI Navigation是什么&#xff1f;二、使用步骤1.安装AI Navigation2.创建模型和材质3.编写向目标移动的脚本4.NavMeshLink桥接组件5.NavMeshObstacle组件6.NavMeshModifler组件 三、效果总结 前言 Unity是一款强大的游戏开发引擎&#xff0c;而人工智能&a…

Swagger添加JWT验证(ASP.NET)

文章目录 JWT1、解析2、配置JWT JWT 1、解析 1&#xff09;客户端向授权服务系统发起请求&#xff0c;申请获取“令牌”。 2&#xff09;授权服务根据用户身份&#xff0c;生成一张专属“令牌”&#xff0c;并将该“令牌”以JWT规范返回给客户端 3&#xff09;客户端将获取到的…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

天星金融(原小米金融)聚焦金融知识普及和反诈宣传,践行金融为民

在信息网络快速发展的背景下&#xff0c;移动互联网为大众的生活带来诸多便利。随之而来的新型诈骗手段也层出不穷&#xff0c;成为当前影响群众安全感、幸福感的“隐形杀手”。天星金融&#xff08;原小米金融&#xff09;一直以来严厉抵制诈骗犯罪行为&#xff0c;积极开展各…

php 快速入门(七)

一、操作数据库 1.1 操作MySQL的步骤 第一步&#xff1a;登录MySQL服务器 第二步&#xff1a;选择当前数据库 第三步&#xff1a;设置请求数据的字符集 第四步&#xff1a;执行SQL语句 1.2 连接MySQL 函数1&#xff1a;mysql_connect() 功能&#xff1a;连接&#xff08;登录…