打家劫舍 III

这篇具有很好参考价值的文章主要介绍了打家劫舍 III。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

打家劫舍 III

题目描述

打家劫舍 III,算法TOP100,数据结构,leetcode,算法,java
打家劫舍 III,算法TOP100,数据结构,leetcode,算法,java

注意点

  • 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警
  • 返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

解答思路

  • 记忆化 + 解决重复子问题解决本题,在任意一个位置,小偷可以选择打劫该房屋和不打劫该房屋,如果打劫,则不能打劫该节点下的子节点,如果不打劫,则该节点下的子节点可以选择打劫也可以选择不打劫,可以转换为动态规划的问题:任意一个位置处能够盗取的最大金额为其子节点能够盗取的最大金额之和其本身加上其孙子节点能够盗取的最大金额之和的最大值,为了防止同一个节点的最大金额重复计算,可以使用Map存储每个节点的最大金额
  • 参考题解在任意一个节点时,可以用大小为2的数组result存储该节点的两种情况:也就是result[0]为不抢劫该节点的最大金额,result[1]为抢劫该节点的最大金额

代码

方法一:

class Solution {
    public int rob(TreeNode root) {
        Map<TreeNode, Integer> map = new HashMap<>();
        return robInterval(root, map);
    }

    public int robInterval(TreeNode root, Map<TreeNode, Integer> map) {
        if (root == null) {
            return 0;
        }
        if (map.get(root) != null) {
            return map.get(root);
        }
        int money = root.val;
        if (root.left != null) {
            money = money + robInterval(root.left.left, map) + robInterval(root.left.right, map);
        }
        if (root.right != null) {
            money = money + robInterval(root.right.left, map) + robInterval(root.right.right, map);
        }
        int maxVal = Math.max(money, robInterval(root.left, map) + robInterval(root.right, map));
        map.put(root, maxVal);
        return maxVal;
    }
}

方法二:文章来源地址https://www.toymoban.com/news/detail-708418.html

// 优化版
class Solution {
    public int rob(TreeNode root) {
        // 0不抢劫,1抢劫
        int[] result = robInternal(root);
        return Math.max(result[0], result[1]);
    }

    public int[] robInternal(TreeNode root) {
        if (root == null) {
            return new int[2];
        }
        int[] leftVal = robInternal(root.left);
        int[] rightVal = robInternal(root.right);
        int[] result = new int[2];
        result[0] = Math.max(leftVal[0], leftVal[1]) + Math.max(rightVal[0], rightVal[1]);
        result[1] =  root.val + leftVal[0] + rightVal[0];
        return result;
    }
}

关键点

  • 动态规划的思想

到了这里,关于打家劫舍 III的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 337. 打家劫舍 III

    原题链接:. - 力扣(LeetCode) 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为  root  。 除了  root  之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 

    2024年04月15日
    浏览(20)
  • leetcode hot100 打家劫舍

    本题中,依旧可以发现,当前位置的金额受到前两个位置金额是否被偷的影响,所以这明显是动态规划的问题。 我们采用动态规划五部曲来进行做 首先我们确定dp数组的含义:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 注意,这里是考虑!那么就说明我这

    2024年02月19日
    浏览(27)
  • 【LeetCode热题100】198. 打家劫舍(动态规划)

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动

    2024年04月11日
    浏览(30)
  • 力扣hot100 打家劫舍 DP 滚动数组

    Problem: 198. 打家劫舍 👨‍🏫 参考地址 时间复杂度: O ( n ) O(n) O ( n ) 空间复杂度: O ( n ) O(n) O ( n ) 空间复杂度: O ( 1 ) O(1) O ( 1 )

    2024年01月19日
    浏览(30)
  • 【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 & LCR 090. 打家劫舍 II

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年01月20日
    浏览(32)
  • 算法第十八天-打家劫舍Ⅱ

    [打家劫舍Ⅱ]是说两个相邻的房间不能同时偷,并且首尾两个房间是相邻的(不能同时偷首尾房间) 明显是基于[打家劫舍Ⅰ]做的升级。[打家劫舍Ⅰ]也是说两个相邻的房间不能同时偷,但是首尾房间不是相邻的(可以同时偷首尾房间) 所以,我们先从[打家劫舍Ⅰ]开始说起。

    2024年01月17日
    浏览(34)
  • Day 42 算法记录|动态规划 09 (打家劫舍)

    1.dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2.dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); 3.初始化,dp[0] 和 dp[1],dp[0] 一定是 nums[0],dp[1] = max(nums[0], nums[1]); 3.遍历顺序,dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历! 进一步对滚动数组

    2024年02月15日
    浏览(28)
  • 【算法】树形DP ② 打家劫舍Ⅲ(树上最大独立集)

    最大独立集 需要从图中选择尽量多的点,使得这些点互不相邻。 337. 打家劫舍 III 用一个数组 int[] = {a, b} 来接收每个节点返回的结果 。返回值{a,b} a表示没选当前节点的最大值,b表示选了当前节点的最大值。 使用 后序遍历 dfs。 ( 发现树形 DP 基本都是后序 dfs ) P1352 没有上

    2024年02月12日
    浏览(35)
  • 力扣198. 打家劫舍

    Problem: 198. 打家劫舍 1.定义状态: dp[i] 表示从第i个房子开始偷起可以偷得的最大金额数目; 2.状态转移:由于不能连续的偷相邻的两个房子,则为了使得从第i个房子开始偷起是最大金额则要判断 是从当前第i个房子开始偷(代码中表示为nums[i] + dp[i + 2]),还是不偷当前第i个房

    2024年04月25日
    浏览(31)
  • _198打家劫舍

    _198打家劫舍 https://leetcode.cn/problems/house-robber/submissions/496496112/

    2024年01月18日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包