213 打家劫舍 2
动态规划
和198的区别是,房屋是首尾相连的,第一件房屋和最后一件房屋相邻,因此第一间房屋和最后一间房屋不能在同一晚偷窃。
关键是如何保证第一间房屋和最后一间房屋不能同时偷窃。如果偷了第一间房屋,则不能偷最后一间房屋,因此偷窃的范围是第一间房屋到倒数第二间房屋;如果偷了最后一间房屋,则不能偷第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋。对于两段下标范围分别计算可以偷窃到的最高总金额,其中最大值就是在
n
n
n间房屋中可以偷到的最高总金额。
class Solution {
public int rob(int[] nums) {
if(nums.length==0){
return 0;
}
if(nums.length==1){
return nums[0];
}
if(nums.length==2){
return Math.max(nums[0],nums[1]);
}
int p = 0;
int q = 0;
int r = 0;
int res;
for(int i=0;i<nums.length-1;i++){
p=q;
q=r;
r=Math.max(p+nums[i],q);
}
res = r;
p=0;
q=0;
r=0;
for(int i=1;i<nums.length;i++){
p=q;
q=r;
r=Math.max(p+nums[i],q);
}
return Math.max(res,r);
}
}
时间复杂度
O
(
n
)
O(n)
O(n)。
空间复杂度
O
(
1
)
O(1)
O(1)。