算法训练营第五十天 | LeetCode 198 打家劫舍、LeetCode 213 打家劫舍II、LeetCode 337 打家劫舍III

LeetCode 198 打家劫舍


代码如下:

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size() + 1, 0);
        dp[1] = nums[0];
        for (int i = 2; i <= nums.size(); i++) {
            dp[i] = max(dp[i - 1] ,dp[i - 2] + nums[i - 1]);
        }
        return dp[nums.size()];
    }
};

LeetCode 213 打家劫舍II


分情况进行讨论即可

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        if (nums.size() == 0) return 0;
        if (nums.size() == 1) return nums[0];
        int result1 = robRange(nums, 0, nums.size() - 2); // 情况二
        int result2 = robRange(nums, 1, nums.size() - 1); // 情况三
        return max(result1, result2);
    }
    int robRange(vector<int>& nums, int start, int end) {
        if (end == start) return nums[start];
        vector<int> dp(nums.size());
        dp[start] = nums[start];
        dp[start + 1] = max(nums[start], nums[start + 1]);
        for (int i = start + 2; i <= end; i++) {
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[end];
    }
};

LeetCode 137 打家劫舍III


直接用简单版递归会超时

java 复制代码
class Solution {
    public int innerRob(int state, TreeNode root) {
        if (root == null) return 0;
        if (state == 1) {
            return (innerRob(0, root.left) + innerRob(0, root.right));
        } else {
            return Math.max(root.val + innerRob(1, root.left) + innerRob(1, root.right), 
                innerRob(0, root.left) + innerRob(0, root.right));
        }
    }
    public int rob(TreeNode root) {
        if (root == null) return 0;
        return Math.max(root.val + innerRob(1, root.left) + innerRob(1, root.right), 
            innerRob(0, root.left) + innerRob(0, root.right));
    }
}

用哈希表记录下重复子问题就没问题了

java 复制代码
class Solution {
    Map<TreeNode, Integer> choose = new HashMap<TreeNode, Integer>();
    Map<TreeNode, Integer> not_choose = new HashMap<TreeNode, Integer>();
    public void dfs (TreeNode root) {
        if (root == null) return;
        dfs(root.left);
        dfs(root.right);
        choose.put(root, root.val + not_choose.getOrDefault(root.left,0) + not_choose.getOrDefault(root.right,0));
        not_choose.put(root,Math.max(Math.max(choose.getOrDefault(root.left,0) + choose.getOrDefault(root.right,0), not_choose.getOrDefault(root.left,0) + not_choose.getOrDefault(root.right,0)),
            Math.max(choose.getOrDefault(root.left,0) + not_choose.getOrDefault(root.right,0), not_choose.getOrDefault(root.left,0) + choose.getOrDefault(root.right,0))));
    }
    public int rob(TreeNode root) {
        dfs(root);
        return Math.max(choose.getOrDefault(root,0), not_choose.getOrDefault(root,0));
    }
}

优化后代码如下:

java 复制代码
class Solution {
    Map<TreeNode, Integer> choose = new HashMap<TreeNode, Integer>();
    Map<TreeNode, Integer> not_choose = new HashMap<TreeNode, Integer>();
    public void dfs (TreeNode root) {
        if (root == null) return;
        dfs(root.left);
        dfs(root.right);
        choose.put(root, root.val + not_choose.getOrDefault(root.left,0) + not_choose.getOrDefault(root.right,0));
        not_choose.put(root,Math.max(choose.getOrDefault(root.left,0), not_choose.getOrDefault(root.left,0)) + Math.max(choose.getOrDefault(root.right,0), not_choose.getOrDefault(root.right,0)));
    }
    public int rob(TreeNode root) {
        dfs(root);
        return Math.max(choose.getOrDefault(root,0), not_choose.getOrDefault(root,0));
    }
}
相关推荐
青云交26 分钟前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu28 分钟前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
Lei活在当下1 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
不穿格子的程序员2 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
lkbhua莱克瓦242 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue0082 小时前
C#类继承
java·开发语言·c#
im_AMBER2 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢2 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
竹竹零2 小时前
JacksonUtil--序列化与反序列化
java·开发语言·windows
钱多多_qdd3 小时前
基础篇:IoC(三):Bean实例化策略InstantiationStrategy
java·spring