leetCode 968.监控二叉树(利用状态转移+贪心)

news2024/12/23 6:50:46

968. 监控二叉树 - 力扣(LeetCode)

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

>>解题思路:

        重要线索->题目示例中的摄像头都没有放在叶子节点上!

        摄像头可以覆盖上中下三层,若把摄像头放在叶子节点上,就浪费一层的覆盖。因此把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖范围

>>思考(ˇˍˇ) 想~为啥不从头结点开始看起呢?为啥从叶子节点看起呢?

        因为头结点放不放摄像头只能省下一个摄像头,叶子节点放不放摄像头省下来了的摄像头数量是指数级别的。也就说我们会从下往上看。局部最优:让叶子节点的父节点安摄像头,所用摄像头最少。整体最优:摄像头所用最少!

        也就说可以用局部最优推出全局最优,且找不出反例,可用贪心!

>>难点:

        ① 二叉树的遍历(后序遍历:左右中,可以在回溯的过程中从下到上进行推导)

        ② 隔两个节点放一个摄像头

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

由于本题状态转移并没有择优的过程,只是单纯的状态转移!所以不需要用动态规划的状态转移公式!!!

  • 节点的三种状态
    • 0:无覆盖
    • 1:有摄像头
    • 2:有覆盖

思考:为什么没有第四种状态,即无摄像头状态?

因为其实无摄像头就是 无覆盖 或者 有覆盖的状态,所以节点就一共还是三个状态。

分情况讨论

class Solution {
public:
    int minCameraCover(TreeNode* root) {
        result = 0;
        if(traversal(root) == 0) {
            result++;
        }
        return result;
    }
private:
    int traversal(TreeNode* cur) {
        // 空节点,该节点有覆盖
        if(cur == NULL) return 2; 
        int left = traversal(cur->left);    // 左
        int right = traversal(cur->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;
    }
    int result;
};

// 状态
// 无覆盖:0
// 有摄像头:1
// 有覆盖:2

// 1.左右都有"覆盖",父节点就设置为"无覆盖"
// 2.左右至少有"无覆盖",父节点就设置为"摄像头"
// 3.左右至少有"摄像头",父节点就设置为"覆盖"

// 4.根节点为"无覆盖",增加一个摄像头

来自代码随想录的课堂讲解截图:

参考和推荐文章:

代码随想录 (programmercarl.com)

贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树_哔哩哔哩_bilibili

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

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

相关文章

AP5126 降压恒流 PIN对PIN替LN2566 LED汽车大灯车灯驱动芯片

产品描述 AP5126 是一款 PWM 工作模式,高效率、外 围简单、内置功率管,适用于 12-80V 输入的高 精度降压 LED 恒流驱动芯片。输出最大功率可达 15W,最大电流 1.2A。 AP5126 可实现全亮/半亮功能切换,通过 MODE 切换:全亮/半…

YZ09: VBA_Excel之读心术

【分享成果,随喜正能量】多要求自己,你会更加独立,少要求别人,你会减少失望,宁愿花时间去修炼 不完美的自己,也不要浪费时间去期待完美的别人!。 我给VBA下的定义:VBA是个人小型自动…

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流,相关的技术框架大行其道,就以目前主流的Vue、React框架来说,它们都基于组件化、响应式、虚拟DOM等技术思想的实现,但是具有不同开发使用方式以及实现原理&#…

Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)

在本博客中,你将学习创建一个 LangChain 应用程序,以使用 ChatGPT API 和 Huggingface 语言模型与多个 PDF 文件聊天。 如上所示,我们在最最左边摄入 PDF 文件,并它们连成一起,并分为不同的 chunks。我们可以通过使用 …

在线商城项目EShop【ListView、adapter】

要求如下: 1、创建在线商城项目EShop; 2、修改布局文件activity_main.xml,使用LineaLayout和ListView创建商品列表UI; 3、创建列表项布局list_item.xml,设计UI用于显示商品图标、名称和价格信息; 4、创…

IT监控制度,IT监控体系如何分层

IT监控系统是指监控和管理it服务管理的软件。它涵盖了监控管理、服务台管理、问题管理和变更管理,旨在帮助组织更有效的运营信息系统,提高运营事故的响应速度。  通过建立集中监控平台,IT监控系统与信息系统的融合可以完成统一的展示和管理…

ICMP差错包

ICMP报文分类 Type Code 描述 查询/差错 0-Echo响应 0 Echo响应报文 查询 3-目的不可达 0 目标网络不可达报文 差错 1 目标主机不可达报文 差错 2 目标协议不可达报文 差错 3 目标端口不可达报文 差错 4 要求分段并设置DF flag标志报文 差错 5 源路由…

【从0学习Solidity】 50. 多签钱包

【从0学习Solidity】50. 多签钱包 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈…

Mac磁盘空间满了怎么办?Mac如何清理磁盘空间

你是不是发现你的Mac电脑存储越来越满,甚至操作系统本身就占了100多G的空间?这不仅影响了电脑的性能,而且也让你无法存储更多的重要文件和软件。别担心,今天这篇文章将告诉你如何清除多余的文件,让你的Mac重获新生。 一…

【kafka实战】01 3分钟在Linux上安装kafka

本节采用docker安装Kafka。采用的是bitnami的镜像。Bitnami是一个提供各种流行应用的Docker镜像和软件包的公司。采用docker的方式3分钟就可以把我们想安装的程序运行起来,不得不说真的很方便啊,好了,开搞。使用前提:Linux虚拟机&…

找不到msvcp110dll,无法继续执行代码,msvcp110dll丢失是什么意思

MSVCP110.dll是一个动态链接库文件,它是Microsoft Visual C 2012 Redistributable package的一部分。这个文件通常用于支持许多Microsoft Visual Studio 2012开发的应用程序。当您在运行某些程序时遇到“找不到msvcp110.dll”的错误时,这意味着您的计算机…

PHY6230低成本遥控灯控芯片国产蓝牙BLE5.2 2.4G SoC

高性价比的低功耗高性能蓝牙5.2系统级芯片,适用多种PC/手机外设连接场景。 高性能多模射频收发机: 通过硬件模块的充分复用实现高性能多模数字收发机。发射机,最大发射功率10dBm;BLE 1Mbps速率接收机灵敏度达到-96dBm&#xff1…

查准率(precision,也叫精确率)和查全率(recall,也叫召回率)

精确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精确率是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率&…

【算法小课堂】滑动窗口

滑动窗口 基本概念: 滑动窗口本质是双指针算法的一种演变 本质上就是同向双指针,窗口的范围就是[left,right) 滑动窗口大致可以分为两类 窗口大小不变的窗口大小变化的 滑动窗口遇到一些验证重复性的问题的时候可以用哈希表来优化 核心思想…

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一书作想象和世界一样宽广

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一书作想象和世界一样宽广

DAZ To UMA⭐二.设置DAZ导出的形态键 和 Daz贴图位置

文章目录 🟧 形态键介绍及在Unity3D中的用途1️⃣ Daz中的形态键2️⃣ Blender 中的形态键3️⃣ 形态键在Unity中的作用🟩 设置DAZ导出的形态键1️⃣ 找到要导出的形态键名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Morphs举例:导出嘴部Morphs🟦 获取模型纹…

uni-app 之 去掉顶部导航

uni-app 之 去掉顶部导航 uniapp怎么样去掉顶部导航 uniapp去掉顶部导航的方法: 1、去掉所有导航栏; 2、单一页面去掉顶部导航栏。 image.png uniapp去掉顶部导航的方法: 1、去掉所有导航栏 "globalStyle": {"navigationBar…

个人电脑怎么搭建服务器 花生壳内网穿透 设置路由器虚拟服务器

在个人电脑上搭建服务器并使用花生壳进行内网穿透,以及在路由器上设置虚拟服务器,需要一些步骤: 内网穿透设置: 配置内网穿透,选择服务器软件的端口号,然后将其映射到您的服务器的内部IP地址和端口号。这将…

web信息收集

1.绕过cdn方法 2.搜索引擎语法 3.whois查询 4.端口探查 5.网站架构 6.其他 7.网站部署结构

Unity3D 检测鼠标位置的Sprite像素颜色

思路 获取鼠标所在屏幕坐标(Vector2)通过相机ScreenToWorldPoint(Vector3)转为世界坐标 (注意Vector3的z是距离相机的距离,相机需要正交)通过SpriteRenderer访问边界Bounds通过Bounds.Contain检测世界坐标是否在SpriteBounds内通过比例计算来确定在Sprite内的UV坐标…