- House Robber II
Medium
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
Example 1:
Input: [2,3,2]
Output: 3
Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2),
because they are adjacent houses.
Example 2:
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
思路1
递归方式
解法1
略
思路2
在思路2的基础上优化,利用辅助数组dp换取时间复杂度。
解法2
略
思路3
在思路2的基础上优化,只使用两个变量代替dp数组。
解法3
class Solution {
public int rob(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
else if(nums.length == 1) {
return nums[0];
}
//组成圆圈,如果抢了第一家,就不能抢最后一家。把第一家和最后一家分别去掉求出两个最大值。再取其大者即可。
return Math.max(robHouse(nums,0,nums.length - 2), robHouse(nums, 1, nums.length - 1));
}
public int robHouse(int[] nums, int left, int right) {
if(right == left) {
return nums[left];
} else if (right - left == 1) {
return Math.max(nums[left], nums[right]);
}
int prePre = nums[left],pre = Math.max(nums[left], nums[left + 1]),temp = 0;
for(int i = left + 2; i <= right; i++) {
temp = Math.max(pre, prePre + nums[i]);
prePre = pre;
pre = temp;
}
return pre;
}
}