《代码随想录》Ⅷ 贪心算法 968. 监控二叉树

《代码随想录》Ⅷ 贪心算法 968. 监控二叉树

革命尚未成功,同志仍需努力!

题目:力扣链接

  • 给定一个二叉树,我们在树的节点上安装摄像头。

    节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

    计算监控树的所有节点所需的最小摄像头数量。

一、思想

这道题的核心是使用贪心算法+后序遍历来确定摄像头的最小安装位置。具体思路如下:

  1. 状态定义

    • 0:该节点无覆盖
    • 1:该节点有摄像头
    • 2:该节点有覆盖(但无摄像头)
  2. 后序遍历策略

    • 从叶子节点开始向上处理
    • 优先让叶子节点的父节点安装摄像头(贪心思想)
  3. 状态转移规则

    • 左右子节点都有覆盖时,当前节点不安装(状态0)
    • 任一子节点无覆盖时,当前节点必须安装(状态1)
    • 任一子节点有摄像头时,当前节点获得覆盖(状态2)

二、代码

class Solution
{
public:
    int result;
    int traversal(TreeNode *root)
    {
        if (root == nullptr)
        {
            return 2; // 空节点,该节点有覆盖
        }

        int left = traversal(root->left);   // 左子树的状态
        int right = traversal(root->right); // 右子树的状态

        // 情况1:左右子树都有覆盖
        if (left == 2 && right == 2)
        {
            return 0; // 本节点无覆盖
        }
        // 情况2:左右子树至少有一个无覆盖
        else if (left == 0 || right == 0)
        {
            result++; // 本节点需要放置摄像头
            return 1; // 本节点需要放置摄像头
        }
        // 情况4:左右子树都有覆盖
        else if (left == 1 || right == 1)
        {
            return 2; // 本节点有覆盖
        }

        return -1; // 其他情况,返回-1,这是为了防止代码逻辑错误
    }

    int minCameraCover(TreeNode *root)
    {
        result = 0; // 初始化摄像头数量
        if (traversal(root) == 0)
        {
            result++; // 根节点无覆盖,需要放置摄像头
        }
        return result;
    }
};


三、代码解析

1. 算法工作原理分解
1.1 后序遍历阶段
  • 遍历顺序:左右根
  • 关键操作:递归处理左右子树
  • 状态获取left = traversal(root->left)​, right = traversal(root->right)
1.2 状态判断阶段
  • 情况1:左右子树都有覆盖(状态2)

    • 当前节点不安装(返回0)
  • 情况2:任一子树无覆盖(状态0)

    • 当前节点必须安装(result++)
    • 返回状态1
  • 情况3:任一子树有摄像头(状态1)

    • 当前节点获得覆盖(返回2)
1.3 根节点特殊处理
  • 最终检查:遍历结束后检查根节点状态
  • 处理逻辑:若根节点无覆盖(状态0),则必须安装摄像头
2. 关键点说明
  • 贪心策略:在保证覆盖的前提下,尽量在最底层节点安装摄像头
  • 状态设计:三种状态确保无遗漏情况
  • 空节点处理:视为已覆盖(状态2),避免影响决策
  • 结果更新:只在安装摄像头时增加计数器

四、复杂度分析

  • 时间复杂度O(n)

    • 需要遍历二叉树的所有节点
    • 每个节点仅处理一次
    • 典型的后序遍历时间复杂度
  • 空间复杂度O(h)

    • 递归栈空间取决于树的高度
    • 最坏情况下(链状树)为O(n)
    • 平均情况下(平衡树)为O(log n)

白展堂:人生就是这样,苦和累你总得选一样吧?哪有什么好事都让你一个人占了呢。 ——《武林外传》

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值