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.
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
因为财产非负,所以最后rob的位置,只可能是两条:
0-n-2;
1-n-1;
有一种很简单的O(1)空间复杂度的做法,代码:
class Solution {
private:
int robber(vector<int>& nums,int l,int r){
if(l>=r){
return nums[l];
}
int ans=0;
int pre=0;
for(int i= l;i<=r;++i){
int temp = max(pre+nums[i],ans);
pre = ans;
ans = temp;
}
return ans;
}
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n<2){
return nums.size()?nums[0]:0;
}
return max(robber(nums,0,n-2),robber(nums,1,n-1));
}
};