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