LeetCode213打家劫舍II

总体思路:
此题是198. 打家劫舍 的拓展版: 唯一的区别是此题中的房间是环状排列的(即首尾相接),
而 198题中的房间是单排排列的;
环状排列意味着第一个房子和最后一个房子中只能选择一个偷窃,
因此可以把此环状排列房间问题约化为两个单排排列房间子问题:
- 在不偷窃第一个房子的情况下(即 nums[1:n-1]),最大金额是 p2
- 在不偷窃最后一个房子的情况下(即nums[0:n−2]),最大金额是 p1
- 综合偷窃最大金额: 为以上两种情况的较大值,即 max(p1,p2) 。
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len==0)
return 0;
if(len==1)
return nums[0];
return Math.max(dp(0,len-2,nums),dp(1,len-1,nums));
}
public int dp(int start,int last,int[] nums){
int prev=0;
int curr=nums[start];
for(int i=start+1;i<=last;i++){
int tmp = Math.max(prev+nums[i],curr);
prev = curr;
curr = tmp;
}
return curr;
}
}
//写这道题时犯了想当然的错误,下意识地把for循环中i=start+2,延用了使用dp数组令i=2的想法
//但忽略了在dp数组那种写法中加的是nums[i-1],本质上还是从nums[1]开始遍历的

浙公网安备 33010602011771号