# 213. House Robber II

Medium
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have a security system connected, and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given an integer array `nums` representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.
Example 1:
Input: nums = [2,3,2]
Output:
3
Explanation:
You cannot rob house 1 (money = 2) and then rob house 3 (money = 2), because they are adjacent houses.
Example 2:
Input: nums = [1,2,3,1]
Output:
4
Explanation:
Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
Example 3:
Input: nums = [1,2,3]
Output:
3
Constraints:
• `1 <= nums.length <= 100`
• `0 <= nums[i] <= 1000`

### 解題

Runtime: 0 ms, faster than 100%
Memory Usage: 2.1 MB, less than 34.97%
func rob(nums []int) int {
if len(nums) == 1 { return nums }
if len(nums) == 2 { return max(nums, nums) }
return max(rob2(nums[1:]), rob2(nums[:len(nums) - 1]))
}
func rob2(nums []int) int {
if len(nums) == 1 { return nums }
arr := []int{ nums, max(nums, nums) }
for i:=2; i<len(nums); i++ {
arr = append(arr, max(arr[i - 1], nums[i] + arr[i - 2]))
}
return arr[len(arr) - 1]
}
func max(a, b int) int {
if a > b { return a }
return b
}