算法训练营第五十天 | 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));
    }
}
相关推荐
青椒大仙KI119 分钟前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
试行10 分钟前
Android实现自定义下拉列表绑定数据
android·java
^^为欢几何^^13 分钟前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
豆浩宇13 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
茜茜西西CeCe16 分钟前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把21 分钟前
Java基础之IO流
java·开发语言
小菜yh22 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.29 分钟前
Java键盘输入语句
java·开发语言
浅念同学29 分钟前
算法.图论-并查集上
java·算法·图论
何不遗憾呢38 分钟前
每日刷题(算法)
算法