代码随想录学习Day 32

news/2024/9/25 0:28:53/

738.单调递增的数字

题目链接

讲解链接

暴力解法:

class Solution:def check(self, n):  # 判断是否各位单调递增max = 10while n:x = n % 10if max >= x:max = xelse:return Falsen = n // 10return Truedef monotoneIncreasingDigits(self, n: int) -> int:for i in range(n, 0, -1):if not self.check(i):i -= 1else:return i

贪心法:题目要求小于等于N的最大单调递增的整数。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。所以可以将N转为字符串形式,从后向前遍历,若某两位非单调递增,则将前一位-1,后一位置为9即可。

class Solution:def monotoneIncreasingDigits(self, n: int) -> int:nums = str(n)  # 将数字转为字符串形式flag = len(nums)  # 标记为,表示该位置之后的数字都应该替换为“9”for i in range(len(nums) - 1, 0, -1):  # 倒序遍历字符串if nums[i] < nums[i - 1]:  # 如果非单调递增flag = i  # 更新标记位nums = nums[:i - 1] + str(int(nums[i - 1]) - 1) + nums[i:]  # 将i-1位置的值-1for i in range(flag, len(nums)):  # 将flag后面的数字都置为‘9’nums = nums[:i] + '9' + nums[i + 1:]return int(nums)

968.监控二叉树

题目链接

讲解链接

把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。因为头结点放不放摄像头也就省下一个摄像头, 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。

局部最优:让叶子节点的父节点安摄像头,所用摄像头最少。

整体最优:全部摄像头数量所用最少。

从低到上,先给叶子节点的父节点放摄像头,然后隔两个节点放一个摄像头,直到二叉树头结点。

class Solution:# Greedy Algo:# 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优# 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head# 0: 该节点未覆盖# 1: 该节点有摄像头# 2: 该节点有覆盖def minCameraCover(self, root: TreeNode) -> int:# 定义递归函数result = [0]  # 用于记录摄像头的安装数量if self.traversal(root, result) == 0:result[0] += 1return result[0]def traversal(self, cur: TreeNode, result: List[int]) -> int:if not cur:return 2left = self.traversal(cur.left, result)right = self.traversal(cur.right, result)# 情况1: 左右节点都有覆盖if left == 2 and right == 2:return 0# 情况2:# left == 0 && right == 0 左右节点无覆盖# left == 1 && right == 0 左节点有摄像头,右节点无覆盖# left == 0 && right == 1 左节点无覆盖,右节点有摄像头# left == 0 && right == 2 左节点无覆盖,右节点覆盖# left == 2 && right == 0 左节点覆盖,右节点无覆盖if left == 0 or right == 0:result[0] += 1return 1# 情况3:# left == 1 && right == 2 左节点有摄像头,右节点有覆盖# left == 2 && right == 1 左节点有覆盖,右节点有摄像头# left == 1 && right == 1 左右节点都有摄像头if left == 1 or right == 1:return 2


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

相关文章

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…

C++泛型算法2——谓词,lambda表达式

定制操作 很多算法都会比较输入序列中的元素。 默认情况下&#xff0c;这类算法使用元素类型的<或运算符完成比较。 标准库还为这些算法定义了额外的版本&#xff0c;允许我们提供自己定义的操作来代替默认运算符。 例如&#xff0c;sort 算法默认使用元素类型的<运算…

【信息系统项目管理师知识点速记】成本管理:规划成本管理

11.3 规划成本管理 规划成本管理是确定如何估算、预算、管理、监督和控制项目成本的过程。主要作用是为整个项目期间的成本管理提供指南和方向。成本管理计划是项目管理计划的组成部分&#xff0c;其中包括成本管理过程及所用工具与技术。 11.3.1 输入 项目章程 包括预先批准…

深入解析算法效率核心:时间与空间复杂度概览及优化策略

算法复杂度&#xff0c;即时间复杂度与空间复杂度&#xff0c;衡量算法运行时资源消耗。时间复杂度反映执行时间随数据规模增长的关系&#xff0c;空间复杂度表明额外内存需求。优化策略&#xff0c;如选择合适数据结构、算法改进、循环展开等&#xff0c;对于提升程序效率、减…

分治策略 --- 快排归并

目录 分治-快排 一、颜色分类 二、排序数组 三、数组中的第K个最大元素 四、库存管理 分治-归并 一、排序数组 二、交易逆序对的总数 三、计算右侧小于当前元素的个数 四、翻转对 分治是一种思想&#xff0c;也就是将大问题分解成小问题&#xff0c;一直分到小问题可…

Linux基础-socket详解、TCP/UDP

文章目录 一、Socket 介绍二、Socket 通信模型三、Socket 常用函数1 创建套接字2 绑定套接字3、监听连接4、接受连接5、接收和发送数据接收数据发送数据 6、关闭套接字 四、Socket编程试验1、源码server.cclient.c 2、编译&#xff1a;3、执行结果 五、补充TCP和UDP协议的Socke…

基于LM Studio + LLaMA3 建立本地化的ChatGPT

4月19日&#xff0c;Facebook母公司Meta重磅推出了Llama3。即便大家现在对于大厂和巨头频繁迭代AI模型的行为已经见怪不怪&#xff0c;Meta的Llama3仍旧显得与众不同&#xff0c;因为这是迄今最强大的开源AI模型。LLaMA模型通常采用了类似于GPT&#xff08;由OpenAI开发&#x…

网络安全新技术:定义未来安全格局

目录 前言 一.软件定义网络安全 (SDN Security) 1.概述 2.SDN 体系结构 3.OPENFLOW 4.SDN 安全 二.零信任安全 (Zero Trust Security) 1.概述 2.NIST 安全信任架构 三动目标防御与网络空间安全拟态防御 1.移动目标防御 (Moving Target Defense) 3.关系 结论 前言 …