【代码随想录训练营】【Day47休息】【Day48】第九章|动态规划|198.打家劫舍|213.打家劫舍II|337.打家劫舍III

打家劫舍

题目详细:LeetCode.198

详细的题解可查阅:《代码随想录》— 打家劫舍

Java解法(动态规划):

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1) return nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for(int i = 2; i < nums.length; i++){
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[nums.length - 1];
    }
}

打家劫舍II

题目详细:LeetCode.213

详细的题解可查阅:《代码随想录》— 打家劫舍II

Java解法(动态规划):

class Solution {
    public int robAction(int[] nums, int begin, int end){
        if(begin == end - 1) return nums[begin];
        int[] dp = new int[nums.length];
        dp[begin] = nums[begin];
        dp[begin + 1] = Math.max(nums[begin], nums[begin + 1]);
        for(int i = begin + 2; i < end; i++){
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[end - 1];
    }

    public int rob(int[] nums) {
        if(nums.length == 1)
            return nums[0];
        return Math.max(robAction(nums, 0, nums.length - 1), robAction(nums, 1, nums.length));
    }
}

打家劫舍III

题目详细:LeetCode.337

详细的题解可查阅:《代码随想录》— 打家劫舍III

Java解法(动态规划,状态标记递归):

class Solution {
    public int rob(TreeNode root) {
        int[] res = robAction1(root);
        // 返回两种情况之中的最大值
        return Math.max(res[0], res[1]);
    }

    int[] robAction1(TreeNode root) {
        int res[] = new int[2];
        if (root == null)
            return res;
        // 后序遍历
        int[] left = robAction1(root.left);
        int[] right = robAction1(root.right);
        // 情况一(不偷父节点,偷子节点): Max(不偷左孩子,偷左孩子) + Max(不偷右孩子,偷右孩子)
        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        // 情况二(偷父节点,不偷子节点):偷当前节点 + 不偷左孩子 + 不偷右孩子 
        res[1] = root.val + left[0] + right[0];
        return res;
    }
}

你可能感兴趣的:(代码随想录训练营,动态规划,算法,leetcode)