题目:
Note: This is an extension of House Robber.
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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.
题目解答:
这个题目是之前House Robber的扩展,需要注意的是,这次的序列是一个环,同样的偷盗策略,不能连着偷窃两家。这就意味着,偷了第一家的东西,就不能偷最后一家的东西。所以,可以将下面两者的值比较一下,取出最大值即可。
(1)偷第一家,不偷最后一家;
(2)从第二家开始偷,偷到最后一家为止。
代码:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() <= 0)
return 0;
if(nums.size() == 1)
return nums[0];
if(nums.size() == 2)
return max(nums[0], nums[1]);
int size = nums.size();
int left = subRob(nums, 0, size - 2);
int right = subRob(nums, 1, size - 1);
return max(left, right);
}
int subRob(vector<int>& nums, int start, int end) {
int size = end - start + 1;
vector<int> getMoney(size);
getMoney[0] = nums[start];
getMoney[1] = max(getMoney[0], 0 + nums[start + 1]);
start += 2;
for(int i = 2; i < size;i++)
{
getMoney[i] = max(getMoney[i - 1],getMoney[i - 2] + nums[start]);
start++;
}
return getMoney[size - 1];
}
int max(int a, int b)
{
return a > b ? a : b;
}
};