代码随想录算法训练营 day48 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

目录

  • 198.打家劫舍
    • 思路
    • 代码
  • 213.打家劫舍II
    • 思路
    • 代码
  • 337.打家劫舍III
    • 思路
    • 题解代码

代码随想录

198.打家劫舍

思路

动态规划:
dp[j]代表0-j个房屋最多能偷的金额数。
dp[j]=max(dp[j-2]+nums[j],dp[j-1])
初始化dp[0]=nums[0] dp[1]=max(nums[0],nums[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[1],nums[0]);

        for(int i = 2;i<nums.length;i++){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);

        }
        return dp[nums.length-1];

    }
}

213.打家劫舍II

思路

思路:和前一条道题类似
dp[j]代表0-j个房屋最多能偷的金额数。
dp[j]=max(dp[j-2]+nums[j],dp[j-1])
初始化dp[0]=nums[0] dp[1]=max(nums[0],nums[1])

考虑不偷第一个 和 不偷最后一个的这两种情况,取最大值。

代码

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

    }

    public int rob(int[] nums,int start,int end){
        int x = nums[start];
        int y = Math.max(nums[start],nums[start+1]);
        int z = Math.max(x,y);
        for(int i = start+2;i<end;i++){
            z = Math.max(x+nums[i],y);
            x=y;
            y=z;
        }
        return z;

        
    }
}

337.打家劫舍III

思路

思路:
层序遍历? dp[j]表示第j层的最大盗取金额
dp[j] = max(dp[j-2]+nums[j],dp[j-1])
初始化
dp[0]=root.val
dp[1]=max(root.val,root.left.val+root.right.val)

题解思路:
使用后序遍历
考虑偷和不偷两种情况取最大

题解代码

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);

        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,数据结构)