【每日一题Day330】LC337打家劫舍Ⅲ | 动态规划

简介: 【每日一题Day330】LC337打家劫舍Ⅲ | 动态规划

打家劫舍Ⅲ【LC337】

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/house-robber-iii

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

果然是 (线下面试 忙忘了)

DFS【超时】

如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子,最后取最大值返回

// 有重复计算
 // 1.递归去偷,超时
    public int rob(TreeNode root) {
        if (root == null)
            return 0;
        int money = root.val;
        if (root.left != null) {
            money += rob(root.left.left) + rob(root.left.right);
        }
        if (root.right != null) {
            money += rob(root.right.left) + rob(root.right.right);
        }
        return Math.max(money, rob(root.left) + rob(root.right));
    }

复杂度


时间复杂度:O(n^2)

空间复杂度:O ( l o g n )

DFS 使用map集合存放计算的结果
  // 2.递归去偷,记录状态
    // 执行用时:3 ms , 在所有 Java 提交中击败了 56.24% 的用户
    public int rob1(TreeNode root) {
        Map<TreeNode, Integer> memo = new HashMap<>();
        return robAction(root, memo);
    }
    int robAction(TreeNode root, Map<TreeNode, Integer> memo) {
        if (root == null)
            return 0;
        if (memo.containsKey(root))
            return memo.get(root);
        int money = root.val;
        if (root.left != null) {
            money += robAction(root.left.left, memo) + robAction(root.left.right, memo);
        }
        if (root.right != null) {
            money += robAction(root.right.left, memo) + robAction(root.right.right, memo);
        }
        int res = Math.max(money, robAction(root.left, memo) + robAction(root.right, memo));
        memo.put(root, res);
        return res;
    }

复杂度

时间复杂度:O ( n )

空间复杂度:O ( l o g n )

树形dp

  1. 确定递归函数的参数和返回值

参数:node

返回值:长度为2的dp数组,存放偷或者不偷的结果

下标为0记录不偷该节点所得到的的最大金钱

下标为1记录偷该节点所得到的的最大金钱。

  1. 确定终止条件

空节点时返回,{0,0}【相当于dp数组的初始化】

  1. 确定遍历顺序

后序遍历

  1. 确定单层递归逻辑

如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0];

如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);

最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}

  1. 举例推导dp

代码

// 不偷:Max(左孩子不偷,左孩子偷) + Max(右孩子不偷,右孩子偷)
    // root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) +
    // Math.max(rob(root.right)[0], rob(root.right)[1])
    // 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷
    // root[1] = rob(root.left)[0] + rob(root.right)[0] + root.val;
    public int rob3(TreeNode root) {
        int[] res = robAction1(root);
        return Math.max(res[0], res[1]);
    }
    int[] robAction1(TreeNode root) {
        int res[] = new int[2];
        if (root == null)
            return res;
        int[] left = robAction1(root.left);
        int[] right = robAction1(root.right);
        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        res[1] = root.val + left[0] + right[0];
        return res;
    }

复杂度

时间复杂度:O ( n )

空间复杂度:O ( l o g n )

目录
相关文章
|
JSON 数据格式
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
857 4
|
8月前
|
关系型数据库 MySQL PHP
2025 游戏试玩打码平台PHP源码
2025 游戏试玩打码平台PHP源码
254 0
2025 游戏试玩打码平台PHP源码
|
8月前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
4753 13
|
测试技术
官方demo:我和灵码搭子的这一年
我是一名后端开发工程师,作为通义灵码的早期用户,见证了其功能日益强大,尤其在增加跨文件补全功能后,代码生成效果显著提升。在有网络的情况下,我的编码效率大幅提升,只需输入少量字符,灵码即可自动完成剩余部分。本文将通过多个场景展示通义灵码在代码补全方面的优势,并分享其在企业环境中的应用效果。此外,还提供了CSDN渠道链接以供进一步了解。
222 4
|
机器学习/深度学习 人工智能 自然语言处理
|
编解码 vr&ar 数据安全/隐私保护
正则表达式
正则表达式
122 0
|
JSON Java Spring
实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务
实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】数据特征选择与降维技术
【4月更文挑战第30天】本文探讨了Python中数据特征选择与降维技术在机器学习和数据分析中的应用。特征选择包括单变量选择、递归特征消除(RFE)、树模型的特征重要性和相关性分析,有助于去除冗余和无关特征。降维技术涵盖PCA、LDA以及非线性方法如KPCA和ISOMAP,用于在低维空间保留信息。这些技术能简化数据、提升模型性能及可解释性。
310 0
|
算法 测试技术 C++
【动态规划】 【字典树】C++算法:472 连接词
【动态规划】 【字典树】C++算法:472 连接词