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));