leetcode 打家劫舍系列

打家劫舍系列

打家劫舍

问题描述
leetcode 打家劫舍系列_第1张图片

问题分析-动态规划
状态:当前多能获取的最大现金
选择:选不选这个房屋
dp_i = max(不选这个房屋,选这个房屋)=max(dp_i_1,dp_i_2+nums[i]);

class Solution {
     
    public int rob(int[] nums) {
     
        int dp_i=0;
        int dp_i_1=0;
        int dp_i_2=0;
        //dp_i表示当前i之后的最大值,从后往前推
        for(int i=nums.length-1;i>=0;i--){
     
            dp_i = Math.max(dp_i_1,nums[i]+dp_i_2);
            dp_i_2=dp_i_1;
            dp_i_1=dp_i;
        }
        return dp_i;
    }
}

打家劫舍Ⅱ

问题描述:leetcode 打家劫舍系列_第2张图片

问题分析:第一间房屋和最后一间不能同时出现,其余同上;

    public int rob(int[] nums) {
     
        if(nums.length==0)return 0;
        if(nums.length==1)return nums[0];
        return Math.max(rob(nums,0,nums.length-2),rob(nums,1,nums.length-1));
    }
    public int rob(int []nums,int strat,int end){
     
        int dp_i=0,dp_i_1=0,dp_i_2=0;
        for(int i=end;i>=strat;i--){
     
            dp_i = Math.max(dp_i_1,nums[i]+dp_i_2);
            dp_i_2 = dp_i_1;
            dp_i_1 = dp_i;
        }
        return dp_i;
    }
}

打家劫舍Ⅲ

问题描述
leetcode 打家劫舍系列_第3张图片
问题分析:

class Solution {
     
    public int rob(TreeNode root) {
     
        //设一个长度为2的数组res,res[0]表示不抢该节点,res[1]表示抢该节点
        int res[]=dp(root);
        return Math.max(res[0],res[1]);
    }
    public int[] dp(TreeNode root){
     
        int res[]=new int[2];
        if(root==null) return res;
        int[]left = dp(root.left);
        int[]right = dp(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,动态规划)