Day33 | 198打家劫舍&213打家劫舍 II&337打家劫舍 III

61 阅读1分钟

打家劫舍 LeetCode 198

题目链接:[LeetCode 198 - 中等]

思路

动态规划的具体思路如下:

①主要将数组分为偷与不偷:偷的放在dp[i][0]中,不偷的放在dp[i][1]中

②遍历顺序:没有很清晰的遍历顺序

动态规划:

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

打家劫舍 II LeetCode 213

题目链接:[LeetCode 213 - 中等]

思路

主要是计算偷第一个房屋还是偷最后一个,其余的与#198没有区别

动态规划:

class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if(len==1)return nums[0];
        return Math.max(robHelper(0,len-1,nums),robHelper(1,len,nums));
    }
    int robHelper(int start,int end,int[] nums){
        int x=0,y=0,z=0;
        for(int i=start;i<end;i++){
            y=z;
            z=Math.max(y,x+nums[i]);
            x=y;
        }
        return z;
    }
}

打家劫舍 III LeetCode 337

题目链接:[LeetCode 337 - 中等]

思路

当时想的时候只考虑了int,而没有考虑int数组。但是采用的方式差不多,都是后序遍历。

动态规划:

class Solution {
    public int rob(TreeNode root) {
        int[] res = robHelper(root);
        return Math.max(res[0],res[1]);
    }
    private int[] robHelper(TreeNode root){
        int[] res = new int[2];
        if(root==null)return res;
        int[] left = robHelper(root.left);
        int[] right = robHelper(root.right);
        res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);
        res[1]=root.val+left[0]+right[0];
        return res;
    }
}