打家劫舍 III——力扣337

news/2024/6/18 21:31:51 标签: leetcode, 算法, 职场和发展

文章目录

    • 题目描述
    • 法一:动态规划

leetcode.cn/problems/house-robber-iii/">题目描述

在这里插入图片描述
在这里插入图片描述

法一:动态规划

问题简化:一棵二叉树,树上的每个点都有对应的权值,每个点有两种状态(选中和不选中),问在不能同时选中有父子关系的点的情况下,能选中的点的最大权值和是多少。

  • 可以用 f(o) 表示选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;g(o) 表示不选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;l 和 r 代表 o 的左右孩子。
  • 当 o 被选中时,o 的左右孩子都不能被选中,故 o 被选中情况下子树上被选中点的最大权值和为 l 和 r 不被选中的最大权值和相加,即 f ( o ) = g ( l ) + g ( r ) f(o)=g(l)+g(r) f(o)=g(l)+g(r)
  • 当 o 不被选中时,o 的左右孩子可以被选中,也可以不被选中。对于 o 的某个具体的孩子 x,它对 o 的贡献是 x 被选中和不被选中情况下权值和的较大值。故 g ( o ) = m a x ( f ( l ) , g ( l ) ) + m a x ( f ( r ) , g ( r ) ) g(o)=max(f(l),g(l))+max(f(r),g(r)) g(o)=max(f(l),g(l))+max(f(r),g(r))

可以用哈希表来存 f 和 g 的函数值,用深度优先搜索的办法后序遍历这棵二叉树,我们就可以得到每一个节点的 f 和 g。根节点的 f 和 g 的最大值就是我们要找的答案

代码

class Solution {
public:
    unordered_map <TreeNode*, int> f, g;

    void dfs(TreeNode* node) {
        if (!node) {
            return;
        }
        dfs(node->left);
        dfs(node->right);
        f[node] = node->val + g[node->left] + g[node->right];
        g[node] = max(f[node->left], g[node->left]) + max(f[node->right], g[node->right]);
    }

    int rob(TreeNode* root) {
        dfs(root);
        return max(f[root], g[root]);
    }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)


http://www.niftyadmin.cn/n/359377.html

相关文章

00_JS基础_ES6

js的标准ECMAScript(ES),现在使用的版本为ES6 js编写的位置 1.写在HTML中的scrip标签 <script>//内嵌式console.log("hello world") </script> <!--引入外部的js文件,script不能使用单标签-->2.引用中使用 <script src"../js/01_index…

vs中计算代码行数

在vs中依次点击以下几个菜单按钮&#xff1a;”编辑“&#xff0c;”查找和替换“&#xff0c;”在文件中查找“&#xff0c;然后输入如下表达式&#xff0c; b*[^:b#/].*$并点击”使用正则表达式“复选框后&#xff0c;然后再”查找范围“选项卡中选择解决方案或者工程或者本…

drf-----认证组件

认证组件 认证组件使用步骤&#xff08;固定用法&#xff09; 1 写一个类&#xff0c;继承BaseAuthentication 2 在类中写&#xff1a;authenticate 3 在方法中&#xff0c;完成登录认证&#xff0c;如果 不是登录的&#xff0c;抛异常 4 如果是登录的&#xff0c…

Java的4种内部类的使用方式及适用场景

Java中有四种形式的内部类&#xff0c;在开发的过程中需要理清楚何时使用合适的内部类&#xff0c;内部类用好了可以提高编码效率、更好的实现封装、甚至可以巧妙实现多继承。当然&#xff0c;某些内部类用多了会削弱面向对象的设计思想&#xff0c;所以内部类不可滥用&#xf…

由于过多的连接错误而被 MySQL服务器 阻止

Caused by: com.mysql.cj.exceptions.CJException: null, message from server: "Host 10.105.***.** is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 这个错误可能表示当您尝试使用 IP 地址为 "10.105.***.**" 的…

YOLOv5【训练train.py逐行源码及参数调参解析】超详细解读!!!建议收藏✨✨!

之前的文章介绍了YOLOv5的网络结构&#x1f680;与目录结构源码&#x1f680;以及detect.py&#x1f680;的详细解读&#xff0c;今天带来的是YOLOv5的 train.py 代码参数逐行解读以及注释&#xff0c;废话不多说&#xff0c;让我们一起学习YOLOv5的 train.py 源码吧&#xff0…

低代码平台名声臭,用起来却真香——90%重复工作给你完成喽

一、前言 开发过程中&#xff0c;只是觉得前端后端合起来&#xff0c;有很多冗余信息&#xff0c;被代码一遍遍重复表达&#xff0c;是一件很枯燥、无聊的事情。 这些枯燥的重复工作&#xff0c;完全可以由机器来做&#xff0c;以便解放出我们的时间&#xff0c;来做更有价值的…

Revit建模|怎么创建轴网标高?

大家好&#xff0c;这里是建模助手&#xff0c;今天给大家讲一讲怎么创建轴网标高。 标高用来定义楼层层高以及生成平面视图&#xff0c;轴网用于为构件定位&#xff0c;在Revit中轴网确定了一个不可见的工作平面&#xff0c;轴网编号以及标高符号样式均可定制修改。目前&…