代码随想录训练营day48|dp:198. 打家劫舍、213.打家劫舍2

LeetCode198打家劫舍

class Solution {
    public int rob(int[] nums) {
        /**第三遍:
        dp[i]:偷到i号房间是的最高金额
        dp[i] = max(dp[i-1], dp[i-2]+nums[i]) 表示偷上一户而不偷i这一户;或者上上一户和当前这一户 
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        循环方向:从前到后
         */
        int size = nums.length;
        if(size == 1){
            return nums[0];
        }
        int[] dp = new int[size];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for(int i=2;i<size;i++){
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[size-1];
    }
}

LeetCode213打家劫舍2

class Solution {
    public int rob(int[] nums) {
        /**第三遍
        这里是环装的,所以要对收尾分情况。因为首位相连的。
         */
        int size = nums.length;
        if(size == 1){
            return nums[0];
        }
        int ans1 = getRob(nums, 0, size-1);
        int ans2 = getRob(nums, 1, size);
        return Math.max(ans1, ans2);
    }

    public int getRob(int[] nums, int start, int end){
    	//这种模式,dp的start 和 end就直接和nums里对应就好了。
        if(end-start==1){
            return nums[start];
        }
        int size = end-start + 1;
        int[] dp = new int[nums.length];
        dp[start] = nums[start]; 
        dp[start+1] = Math.max(nums[start], nums[start+1]);
        for(int i=start+2;i<end;i++){
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[end-1];
    }
}

你可能感兴趣的:(LeetCode刷题,算法,leetcode,数据结构)