LeetCode 213. 打家劫舍 II

LeetCode 213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。
同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

题解
由于是环状,所以第一个房子 和最后一个房子只能选一个偷
因此我们只能从这两种情况中选取一个最大值即可。
当前最大值只能是两种情况:


一、 偷n-2,不偷n-1,偷n
二、不偷n-2,偷n-1,不偷n


依次递推即可求出最大金额


由于不是需要反复取得之前的状态值,只需要n-2,n-1,n所以可将dp的空间复杂度优化成常数级别
pre=n-2
cur=n-1
每次保存更新这两个值即可

public class rob {
     
    public int rob(int[] nums){
     
        if (nums.length==0){
     
            return 0;
        }
        if (nums.length==1){
     
            return nums[0];
        }
        return Math.max(dfs(Arrays.copyOfRange(nums,0,nums.length-1)),
                dfs(Arrays.copyOfRange(nums,1,nums.length)));
    }
    private int dfs(int[] nums){
     
    	//n-2
       int pre=0;
       //n-1
       int cur=0;
       int temp=0;
       for (int num:nums){
     
           temp=cur;
           //max(n-2+n,n-1)
           cur=Math.max(pre+num,cur);
           //更新状态
           pre=temp;
       }
       return cur;
    }
}

你可能感兴趣的:(动态规划,leetcode,动态规划,算法)