这个问题二与一的区别是,第一个房屋和最后一个是紧挨着的,所有数组可以理解为一个环形。
这里要考虑的两种情况:
第一种,假设取数组第一个元素,那数组最后一个元素就不会被取到。
第二种,假设取数组最后一个元素,那数组第一个元素就不会被取到。
剩下的代码和一相似。 打家劫舍一
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n == 0) return 0;
if(n == 1) return nums[0];
//在这两种情况下,把数组分段,分别取最后值最大的情况。
return Math.max(robRange(Arrays.copyOfRange(nums, 0, nums.length - 1)),
robRange(Arrays.copyOfRange(nums, 1, nums.length)) );
}
public int robRange(int[] nums) {
int n = nums.length;
int prev = 0; // dp[n-2]
int cur = 0; // dp[n-1]
for(int i = 0; i < n; i++){
int temp = Math.max(cur, prev + nums[i]); //dp[n]
prev = cur;
cur = temp;
}
return cur;
}
}
版权声明:本文为weixin_46442179原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。