算法训练营第五十天 | 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));
    }
}
相关推荐
思麟呀24 分钟前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落1 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Lansonli2 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
budingxiaomoli2 小时前
Spring AOP
java·spring·java-ee
特立独行的猫A2 小时前
Ionic + 仓颉语言的 cj-tauri 开发框架实战:开发精美移动端 APP
java·后端·python
Pniubi2 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
nice_lcj5202 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
꧁细听勿语情꧂3 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
文丑颜不良啊3 小时前
LeetCode2741~2760题目解析
java·leetcode
俊俊几年的3 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c