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.
实现思路:
This problem is a little tricky at first glance. However, if you have finished the House Robber problem, this problem can simply be decomposed into two House Robber problems.
Suppose there are n houses, since house 0 and n - 1 are now neighbors, we cannot rob them together and thus the solution is now the maximum of
Rob houses 0 to n - 2;
Rob houses 1 to n - 1.
#define max(a,b) (((a)>(b))?(a):(b))
int robber(int *nums,int start,int end)
{
int prev1 = 0;
int prev2 = 0;
int curr = 0;
for(int i = start;i <= end;i++)
{
curr = max(nums[i] + prev2,prev1);
prev2 = prev1;
prev1 = curr;
}
return curr;
}
int rob(int* nums, int numsSize)
{
if(0 == numsSize)
return 0;
if(1 == numsSize)
return nums[0];
return max(robber(nums, 0, numsSize - 2), robber(nums, 1, numsSize - 1));
}