算法修炼Day48|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

64 阅读1分钟
题目:
代码实现:
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 Math.max(dp[nums.length - 1], dp[nums.length - 2]);
    }
}
题目:213. 打家劫舍 II - 力扣(LeetCode)
代码实现:
class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        if (n == 1) return nums[0];
        // 第一间房子偷与不偷两种情况:
        return Math.max(nums[0] + robA(nums, 2, n - 1), robA(nums, 1, n));
    }
    public int robA(int[] nums, int start, int end) {
        int f0 = 0, f1 = 0;
        for (int i = start; i < end; i++) {
            int newF = Math.max(f0 + nums[i], f1);
            f0 = f1;
            f1 = newF;
        }
        return f1;
    }
}

题目:leetcode.cn/problems/ho…
代码实现:
class Solution {
    public int rob(TreeNode root) {
        int[] ans = dfs(root);
        return Math.max(ans[0], ans[1]);
    }
    private int[] dfs(TreeNode root) {
        if (root == null)
            return new int[]{0, 0};
        int[] left = dfs(root.left);
        int[] right = dfs(root.right);
        int rob = root.val + left[1] + right[1];
        int noRob = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        return new int[]{rob, noRob};
    }
}