问题
例子
思路
- 跟打家劫舍I相比,加了条件:第一个和最后一个不能同时偷
则:有三种情况
- 不偷第一个,可以偷最后一个,求1~n-1的结果
- 不偷最后一个,可以偷第一个,求0~n-2的结果
- 第一个和最后一个都不偷,求1~n-2的结果【一定小于1,2】
比较1,2的结果即可,即问题由求nums的结果变成了 m a x ( n u m s [ 0 , n − 1 ] , n u m s [ 1 , n ] ) max(nums[0,n-1], nums[1,n]) max(nums[0,n−1],nums[1,n])
代码
class Solution {
public int rob(int[] nums) {
if(nums.length==0) return 0;
if(nums.length==1) return nums[0];
int a = get(Arrays.copyOfRange(nums,0,nums.length-1));
int b = get(Arrays.copyOfRange(nums,1,nums.length));
return Math.max(a,b);
}
public int get(int[] nums){
int[] res=new int[nums.length];
if(nums.length==0) return 0;
if(nums.length==1) return nums[0];
if(nums.length==2) return Math.max(nums[0],nums[1]);
res[0]=nums[0];
res[1]=Math.max(nums[0],nums[1]);
for(int i=2; i<nums.length; i++) {
res[i]=Math.max(res[i-2]+nums[i], res[i-1]);
}
return res[res.length-1];
}
}