力扣-968监控二叉树(Java贪心详细题解)

news2024/9/22 21:21:31

题目链接:968. 监控二叉树 - 力扣(LeetCode)

前情提要:

本题是一道名副其实的hard题目,他考察二叉树和贪心的综合运用能力。

所以我们不仅要会贪心还要会二叉树的一些知识,如果没有写二叉树类型的题目,建议大家该题可以放放,去刷其他的题目。

因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。

贪心方法:局部最优推出全局最优。

如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。

题目思路:

本题要求监控树所有节点的最小摄像头数量。我们如何求这个最小摄像头数量呢?

一般遇到二叉树类的题目,遍历顺序很重要,我们如何确认这个遍历顺序呢?

确认遍历顺序

其实从案例我们也会发现,摄像头都没有放在叶子节点,而是放在了叶子节点的父节点。

首先我们要知道一个摄像头所监控的最大范围就是三层。

那么我们怎么最大限度的使用这个条件呢?这就是贪心所在。

我们尽量在叶子节点的父节点设为摄像头 这样可以最大限度的使用摄像头监控三层的条件。

以这个题局部贪心:再每一个叶子节点前面放一个摄像头,再每隔俩个节点再放一个摄像头。

全局最优:所得的摄像头的就是最少的。

那么肯定有人想叶子节点的父节点设摄像头 那我们可不可以在根节点的孩子节点设摄像头呢?

理论也行,但是本题要求最少的摄像头,我们就要最大限度的节省摄像头,由于一个二叉树叶子节点肯定大于等于根节点,处于节约叶子节点的摄像头而言,我们应该从叶子节点出发。

遍历顺序咱们就定下来 就是后序 从叶子节点向上返回结果为父节点。

那么我们如何隔两个节点放一个摄像头

此时需要分析每个节点的状态 三种情况的判定 0 无覆盖 1摄像头 2覆盖。

所以我们得根据左右孩子节点的状态来确认父节点的状态。

但是我们要对二叉树内的null值进行一个特判,null值应该赋给什么状态呢? 答案是赋值为2。为什么赋值为2呢。我们下面讲。

1.左右孩子节点全为2状态 父节点就为 0。

在这里插入图片描述

这里可能互相会想为什么状态为0 为什么不是1 这是因为我们是后序遍历,回溯的过程是从下到上,当孩子节点状态为2 肯定是孩子节点的下层节点出现了 1 此时我们本着最大节约摄像头的原则,他们的父节点就为0,由父节点的父节点为摄像头来将父节点覆盖。

这时我们就想通为什么null值设为2了,当一个孩子为叶子节点,他下一层返回的状态就是俩个2,那他本身应该就是未被覆盖的状态,因为本题的贪心思路就是让叶子节点都为非覆盖状态,让他的父节点为摄像头来监控下面三层的情况。

2.任意孩子节点为1 父节点就是2。

如果任意一个孩子节点被摄像头监控,那父节点就是被覆盖的范围,因为摄像头监控的范围未3层,他可以覆盖他上一层的也就覆盖父节点。

3.任意孩子为 0 父节点就是1。

在这里插入图片描述

如果是以下情况,则中间节点(父节点)应该放摄像头:

  • left == 0 && right == 0 左右节点无覆盖
  • left == 1 && right == 0 左节点有摄像头,右节点无覆盖
  • left == 0 && right == 1 左节点有无覆盖,右节点摄像头
  • left == 0 && right == 2 左节点无覆盖,右节点覆盖
  • left == 2 && right == 0 左节点覆盖,右节点无覆盖

这个不难理解,毕竟有一个孩子没有覆盖,父节点就应该放摄像头。

特判第四种方式 如果根节点为无覆盖 则将根节点设为1 即设为摄像头。

在这里插入图片描述

所以状态分析完了就可以开始写代码了

最终代码:

/**
 * 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 {
    //result用来记录结果
    int result = 0;
    public int minCameraCover(TreeNode root) {
        //temp用来判定第四种情况
        int temp = dfs(root);
        if(temp == 0){
            result ++;
        }
        return result;
        
    }
    public int dfs(TreeNode root){
        //递归三部曲
        //第一步确定方法的返回值和参数
        //后序需要子节点的状态来确认父节点的状态,所以我们需要将返回值设为int
        //第二步确定终止条件
        //遍历树最终会遇到null节点 所以终止条件就是遇到null就不要向下递归了 就该向上返回状态值了
        //第三步确定单层循环逻辑
        if(root == null)return 2;
        //遍历顺序 后序 左右中 即先递归左边 再递归右边 最后处理中间节点
        //左
        int left = dfs(root.left);
        //右
        int right = dfs(root.right);
        //三种情况的判定 0 无覆盖 1摄像头 2覆盖
        //1.当孩子节点全为 2 父节点就为0
        //2.当孩子节点有一个为0 父节点就为1
        //3.当孩子节点有一个为1 父节点就为 2
        if(left == 2&&right == 2)return 0;
        if(left == 0 ||right == 0){
            result ++;
            return 1;
        }
        if(left == 1 ||right == 1)return 2;
        return 0;
    }
}

这到题确实很难,所以需要大家多琢磨琢磨,多模拟几遍。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

实战项目-快速实战-springboot dataway

最后附项目源码, 开箱即用 访问地址 http://127.0.0.1:8101/interface-ui/#/ 效果图 具体怎么用, 大家还是看官网,中文文档 https://www.dataql.net/docs/dataway/ui/ui-list 项目结构 代码 DataWayApplication package com.zero.dataway;import net.hasor.spring.boot…

集合框架,List常用API,栈和队列初识

回顾 集合框架 两个重点——ArrayList和HashSet. Vector/ArraysList/LinkedList区别 VectorArraysListLinkedList底层实现数组数组链表线程安全安全不安全不安全增删效率较低较低高扩容*2*1.5-------- (>>)运算级最低,记得加括号。 常…

窖藏之秘:白酒在窖藏过程中经历了哪些变化?

在中华五千年的文明史中,白酒一直扮演着举足轻重的角色。它不仅是文人墨客笔下的灵感源泉,更是亲朋好友间传递情感的桥梁。在众多白酒品牌中,豪迈白酒(HOMANLISM)以其不同的酿造工艺和窖藏技艺,成为了酒中翘…

EasyExcel模板导出与公式计算(上)

目录 环境要求 功能预览 需求分析 源码跟踪 自定义数据处理器 ​总结 最近做项目时遇到这样一个需求,将数据库表的含有公式的信息导出为Excel文件并且需要计算其结果,由于上网查询资料后未能完美解决,故将此踩坑过程记录下来以供参考。…

Datawhale X 李宏毅苹果书 AI夏令营第五期 DL进阶方向 Task3笔记

Datawhale X 李宏毅苹果书 向李宏毅学深度学习(进阶) 是 Datawhale 2024 年 AI 夏令营第五期的学习活动(“深度学习 进阶”方向) 往期task1链接:深度学习进阶-Task1 往期task2链接:深度学习进阶-Task2 我做…

惠中科技RDS自清洁膜层:光伏领域的绿色革命

惠中科技RDS自清洁膜层:光伏领域的绿色革命 在全球能源转型和光伏产业蓬勃发展的背景下,光伏电站的运营维护面临着诸多挑战,其中灰尘污染问题尤为突出。灰尘的堆积不仅降低了光伏板的透光率,还直接影响了电站的发电效率和经济效益…

算法复盘——Leetcode hot100: 双指针算法

双指针算法 11. 盛最多水的容器 - 力扣(LeetCode) 优化解法:用 left 和 right 两个指针从两端向中心收缩,一边收缩一边计算 [left, right] 之间的矩形面积,取最大的面积值即是答案。 其实是优化区间选择 直接丢弃体…

51单片机-串口通信(单片机和PC互发数据)

作者:Whappy 时间:2024.9.3 关于串口的疑问? 根据我的代码是不是初始化完成串口之后,只要我们使用串口发送数据就会触发中断? (在文章下面) ChatGPT said: ChatGPT 是的,根据…

IDEA项目启动在不同端口的方法,服务多端口启动

前言 在本地测试分布式事务以及分布式锁的过程中,在IDEA中多端口启动服务,可以高效方便开展测试调试工作。 开启流程 1.打开Edit Configurations 2.选中要复制的服务,点击复制小图标 3.配置启动端口号,点击保存 --server.port1…

解密Docker核心:深入理解Docker基础架构

随着云计算技术的普及,Docker容器技术在现代应用开发和部署中占据了重要地位。要充分理解Docker的优势与运用,深入掌握其基础架构是关键。本文将深入探讨Docker的核心组成部分及其在容器化平台中的角色和作用。 一、Docker的基础架构概述 Docker的基础…

leetcode 2816.翻倍以链表形式表示的数字

1.题目要求: 给你一个 非空 链表的头节点 head ,表示一个不含前导零的非负数整数。将链表 翻倍 后,返回头节点 head 。2.题目代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ str…

AI建模——文/图生模型产品介绍与模型免费下载

说明: 记录AI文生3D模型、图生3D模型的相关产品;记录其性能、功能、收费与免费方法 1.AI建模产品 Robin MeshAnything Meshy 生成效果比较: 2. Rodin 官网:gHyperHuman 支持:文生模型、图生模型 模型生成与下载…

自动控制:模糊控制器的原理及设计

自动控制:模糊控制器的原理及设计 引言 随着控制技术的不断发展,模糊控制器(Fuzzy Controller)作为一种智能控制技术,广泛应用于许多复杂系统中。与传统的线性控制器不同,模糊控制器无需精确的数学模型&a…

IOS17.0安装巨魔:TrollRestore巨魔发布

👻 TrollRestore 17.0 巨魔发布 15.0 - 16.7 RC(20H18)和17.0。 官网:https://trollrestore.com/ 下载:https://pan.metanetdisk.com/IOS/%E5%B7%A8%E9%AD%94%E7%8E%A9%E5%AE%B6/TrollRestore.com 使用:ht…

《OpenCV计算机视觉》—— 图像边缘检测

文章目录 一、图像边缘检测概述二、常见的图像边缘检测算法(简单介绍)1.sobel算子2.Scharr算子3.Laplacian算子4.Canny算子 三、代码实现 一、图像边缘检测概述 图像边缘检测是一种重要的图像处理技术,用于定位二维或三维图像中对象的边缘。…

【运维监控】prometheus+node exporter+grafana 监控linux机器运行情况(1)

本示例是通过prometheus的node exporter收集主机的信息,然后在grafana的dashborad进行展示。本示例使用到的组件均是最新的,下文中会有具体版本说明,linux环境是centos。本示例分为四个部分,即prometheus、grafana、node exporter…

南京网站建设自己网站

南京是一座古老而又现代化的城市,拥有悠久的历史和文化底蕴。在这个信息时代,网站已经成为了企业和个人宣传推广的重要途径之一。南京网站建设作为一种推广方式,不仅能够展示企业形象,还能够传递信息、吸引客户、增加销售。 南京网…

Spring Boot-自定义banner

在 Spring Boot 应用中,你可以自定义启动时显示的 banner。这些 banner 可以包括图形、文字或者其他形式的标识。如图所示: 1. 使用 banner.txt 文件 默认情况下,Spring Boot 使用项目的 banner.txt 文件中的内容作为启动时的 banner。你可以…

计算机岗位(面试)

计算机岗位(面试) 计算机主要有哪几部分构成?计算机组成原理的内容? 计算机主要由‌硬件和软件‌两大部分构成。‌硬件部分包括五大基本组件:‌‌运算器、‌控制器、‌存储器、‌输入设备和输出设备‌‌。‌具体来说&a…

用户变渠道,Xinstall引领手游推广新潮流

随着手游市场的日益繁荣,手游推广方式也在不断革新。从传统的地推、广告投放到如今新兴的CPA(按动作付费)和CPS(按销售订单付费)模式,手游推广正逐步走向效果导向的时代。而在这个过程中,Xinsta…