代码随想录学习Day 32

ops/2024/10/21 5:46:26/

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/ops/27228.html

相关文章

OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户前言OceanBase 数据更新架构前提条件连接操作连接示例OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户 编辑 …

vue3 使用pinia -- vue2 vuex的plus版

接入状态store 即 vuex 呃(⊙﹏⊙)vuex这里可以略过了&#xff0c;我在研究完后&#xff0c;才发现vue3出来个pinia&#xff0c;是vuex的升级&#xff0c;体积更小更省事&#xff0c;我不删这里了&#xff0c;单纯记录下&#x1f642; --pinia用法下面有写哦 ① 执行 npm insta…

SAP PP学习笔记09 - 作业区(工作中心Work Center)Customize2(管理码,班次顺序,计算式),标准Text,作业区阶层

上文讲了作业区&#xff08;工作中心&#xff09;的概念及其中重要字段&#xff0c;以及作业区的部分Customize。 SAP PP学习笔记08 - 作业区&#xff08;工作中心Work Center&#xff09;&#xff0c;作业区Customize-CSDN博客 本文继续讲 作业区的Customize。 Spro > 生…

# GTP-SoVITS语音训练合成测试-20240430

GTP-SoVITS语音训练合成测试-20240430 文章目录 GTP-SoVITS语音训练合成测试-202404301 机器配置2 测试文本3 测试结果4 结论 https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu https://github.com/RVC-Boss/GPT-SoVITS?tabreadme-ov-file htt…

【IC设计】CRC(循环冗余校验)

目录 理论解读CRC应用CRC算法参数解读常见CRC参数模型 设计实战校招编程题分类串行输入、并行计算、串行输出**串行计算、串行输出&#xff08;线性移位寄存器&#xff09;LSFR线性移位寄存器&#xff08;并转串&#xff09;(并行计算)模二除 总结——串行、并行计算的本质参考…

面试笔记——多线程使用场景

线程池使用场景&#xff08;CountDownLatch&#xff0c; Future&#xff09; CountDownLatch CountDownLatch&#xff08;闭锁/倒计时锁&#xff09;用来进行线程同步协作&#xff0c;等待所有线程完成倒计时&#xff08;一个或者多个线程&#xff0c;等待其他多个线程完成某件…

MongoDB聚合运算符:$sqrt

MongoDB聚合运算符&#xff1a;$sqrt 文章目录 MongoDB聚合运算符&#xff1a;$sqrt语法使用举例 $sqrt聚合运算符返回数值的平方根&#xff0c;数值必须为正数&#xff0c;返回值为双精度数。 语法 { $sqrt: <number> }<expression>为可解析为非负数的表达式。 …

python实现的基于单向循环链表插入排序

相比于定义一个循环双向链表来实现插入排序来说&#xff0c;下面的实现采用一个单向循环链表来实现&#xff0c;并且不需要定义一个单向循环链表类&#xff0c;而是把一个list&#xff08;数组/顺序表&#xff09;当成单向循环链表来用&#xff0c;list的元素是一个包含两个元素…