Description:
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 tonightwithout alerting the police.
这题是House Robber的变型,简单点来说就是原来的一行住宅现在首尾连接连成一圈。也就是说在给出的nums向量里面第一间屋子跟第二间屋子是不能同时偷的。因此分开两种情况来计算(不偷第一间屋子或者不偷最后一间屋子),每种情况再用上次做的House Robber的做法得出结果,取两者中的较大值即可。代码如下:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==0)return 0;
if(nums.size()==1)return nums[0];
vector<int> num1(nums.begin(),nums.end()-1);
vector<int> num2(nums.begin()+1,nums.end());
int p,c,mon1,mon2;
p=c=mon1=mon2=0;
for(int i=0;i<num1.size();i++)
{
mon1=max(p+num1[i],c);
p=c;
c=mon1;
}
p=c=0;
for(int i=0;i<num2.size();i++)
{
mon2=max(p+num2[i],c);
p=c;
c=mon2;
}
return max(mon1,mon2);
}
};