代码随想录——贪心23监控二叉树

news/2024/12/26 11:03:48/文章来源:https://www.cnblogs.com/neromegumi/p/18632268

image
image
image
image

思路

这道题目首先要想,如何放置,才能让摄像头最小的呢?

从题目中示例,其实可以得到启发,我们发现题目示例中的摄像头都没有放在叶子节点上!

这是很重要的一个线索,摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。

所以把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。

那么有同学可能问了,为什么不从头结点开始看起呢,为啥要从叶子节点看呢?

因为头结点放不放摄像头也就省下一个摄像头, 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。

所以我们要从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!

局部最优推出全局最优,找不出反例,那么就按照贪心来!

此时,大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。

此时这道题目还有两个难点:

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

确定遍历顺序

在二叉树中如何从低向上推导呢?

可以使用后序遍历也就是左右中的顺序,这样就可以在回溯的过程中从下到上进行推导了。

如何隔两个节点放一个摄像头

此时需要状态转移的公式,先来看看每个节点可能有几种状态:

有如下三种(用数字表示):

  1. 该节点无覆盖——0
  2. 本节点有摄像头——1
  3. 本节点有覆盖——2
    空节点属于哪种状态?为保证叶节点是无覆盖,让他的父节点放摄像头,空节点只能是有覆盖。如果空节点是无覆盖那叶节点就要放摄像头了。

由此确定递归的终止条件:

// 空节点,该节点有覆盖
if (cur == NULL) return 2;

再来看单层逻辑处理。主要有如下四类情况:
情况1:左右节点都有覆盖
情况2:左右节点至少有一个无覆盖的情况
情况3:左右节点至少有一个有摄像头
情况4:头结点没有覆盖
image
递归结束之后,还要判断根节点,如果没有覆盖,result++
代码如下:

int minCameraCover(TreeNode* root) {result = 0;if (traversal(root) == 0) { // root 无覆盖result++;}return result;
}

完整代码

class Solution {
public:int ans;int traversal(TreeNode* root){//空节点if(root == nullptr)return 2; //0-无覆盖,1-有摄像头,2-有覆盖//后序遍历int left = traversal(root->left);int right = traversal(root->right);//情况1:左右都有覆盖if(left == 2 && right == 2)return 0;//情况2:左右至少一个无覆盖if(left == 0 || right == 0){ans++;return 1;}//情况3:左右至少有一个有摄像头if(left == 1 || right == 1)return 2;return -1;}int minCameraCover(TreeNode* root) {if(traversal(root) == 0){ans++;}return ans;}
};

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

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

相关文章

CH585 CH584 I2C时钟配置(超1MHz 最高1.8MHz)

I2C的R16_I2C_CTRL2寄存器描述:[5:0] FREQ :允许的范围在2~36MHz之间。必须设置在000010b 到100100b 之间RB_I2C_FREQ决定SCL的建立时间和SDA的保持时间,理论上I2C 频率可以达到一分频,实际频率可在36MHz之上,可使用最高80MHz。 I2C的R16_I2C_CKCFGR寄存器描述:[11:0] CC…

JMeter JDBC 请求实战宝典

《JMeter JDBC 请求实战宝典》 宝子们,今天咱就来唠唠 JMeter 里超厉害的 JDBC 请求,这玩意儿就像是数据库世界的神奇魔杖,能帮咱把数据库里的各种秘密(数据)都挖出来,还能对这些数据进行各种操作,不管是查查看、改一改,还是加点新东西、删点旧东西,它都能轻松搞定,而…

STM32-I2C软件模拟

1.I2C介绍 I2C是一种多主机、两线制、低速串行通信总线,广泛用于微控制器和各种外围设备之间的通信。它使用两条线路:串行数据线(SDA)和串行时钟线(SCL)进行双向传输。2.时序启动条件:SCL高电平时、SDA由高电平变为低电平 停止条件:SCL高电平时、SDA由低电平变为高电平…

系统攻防-WindowsLinux远程探针本地自检任意代码执行权限提升入口点

Windows&Linux&远程探针&本地自检&任意代码执行&权限提升&入口点知识点: 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫(提权)-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件一、演示案例-操作系统-远程漏…

新能源汽车门店管理:项目管理工具的高效运用策略

使用项目管理工具进行新能源汽车门店管理可以显著提高门店的运营效率和团队协作能力。通过明确项目目标和需求、选择合适的项目管理工具、实施项目管理以及持续优化与改进等步骤,新能源汽车门店可以更好地应对市场变化,提升竞争力。使用项目管理工具进行新能源汽车门店管理,…

C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验

C5GAME 通过采用云消息队列 RocketMQ 版 Serverless 系列,有效解决了现有架构中存在的性能瓶颈,极大增强了交易系统的灵活性和稳定性,有效实现了流量的削峰填谷,显著提升了整体运维效率,确保了千万级玩家能够享受到流畅的游戏交易体验。作者:邹星宇、刘尧 C5GAME:安全便…

SQL语言1-MySQL

1. SQL语言 1.1 关系型数据库的常见组件数据库:database 表的集合,物理上表现为一个目录 表:table,行:row 列:column 索引:index 视图:view,虚拟的表 存储过程:procedure 存储函数:function 触发器:trigger 事件调度器:event scheduler,任务计划 用户:user 权限…

虚引用

当被应用的强引用失去后,强引用关联的这个引用也就是虚引用相关的分配就会被回收以ThreadLocal<T>为例1.进行塞值 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { …

容器环境的MySQL、canal、Elasticsearch数据同步测试

回顾一次容器环境的MySQL、canal、Elasticsearch数据同步 MySQL和Elasticsearch安装初始化就不展示了,版本如下:sql表关键字段如下: CREATE TABLE `fault_code` (`title` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,`description` varchar(512) CHARACTER SET utf8mb…

从全球到本地:跨境电商如何提升供应链管理效率

一、引言 随着全球化的推进与互联网技术的飞速发展,跨境电商已成为全球贸易的重要组成部分。跨境电商平台通过缩短国际贸易的链条,打破了传统贸易壁垒,使消费者能够方便快捷地购买来自世界各地的商品。然而,跨境电商的成功不仅仅依赖于商品的丰富性和价格竞争力,背后更为复…

违规停放智能监测摄像机

违规停放智能监测摄像机结合高清晰度摄像功能和智能识别算法,可以对违规停放行为进行准确识别和监测。这种设备可根据设定的监测区域和参数,自动识别车辆停放位置和停放时间,一旦发现有车辆违停停放,系统将立即发送警报通知相关部门及时处理。通过这种方式,可以及时发现、…