算法训练营第五十天 | 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));
    }
}
相关推荐
yihuiComeOn20 分钟前
[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅
java·后端·spring
fengfuyao9851 小时前
竞争性自适应重加权算法(CARS)的MATLAB实现
算法
散峰而望1 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
leoufung1 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
Porunarufu1 小时前
Java·关于List
java·开发语言
靠沿1 小时前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
程序猿小蒜1 小时前
基于springboot的的学生干部管理系统开发与设计
java·前端·spring boot·后端·spring
wyhwust2 小时前
交换排序法&冒泡排序法& 选择排序法&插入排序的算法步骤
数据结构·算法·排序算法
利刃大大2 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
q***56382 小时前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring