在Ⅰ的基础上进行修改,这里面要额外考虑的就是是否偷窃第一个房间和偷窃最后一个房间,所以就分别计算一下两种情况的值,然后取最大值就可以了。
偷窃第一个房间:
int[] result2 = new int[length];
result2[0] = nums[0];
result2[1] = Math.max(nums[0],nums[1]);
for (int i = 2; i < length - 1; i++){
result2[i] = Math.max(nums[i] + result2[i - 2], result2[i - 1]);
}
偷窃最后一个房间:
int[] result = new int[length];
result[1] = nums[1];
result[2] = Math.max(nums[1],nums[2]);
for (int i = 3; i < length; i++){
result[i] = Math.max(nums[i] + result[i - 2], result[i - 1]);
}
最后比较一下:Math.max(result[length - 1],result2[length-2])即可。
代码:
class Solution {
public int rob(int[] nums) {
final int length = nums.length;
if (length == 0){
return 0;
}
if (length == 1){
return nums[0];
}
if (length == 2){
return Math.max(nums[0],nums[1]);
}
int t1 = compute(nums,2,length-1);
int t2 = compute(nums,3,length);
return Math.max(t1,t2);
}
private int compute(int[] nums, int start, int end) {
int length = nums.length;
int[] result = new int[length];
if (start == 2){
result[0] = nums[0];
result[1] = Math.max(nums[0],nums[1]);
}else {
result[1] = nums[1];
result[2] = Math.max(nums[1],nums[2]);
}
for (int i = start;i < end; i++){
result[i] = Math.max(nums[i] + result[i - 2], result[i - 1]);
}
return result[end - 1];
}
}