## [213\. House Robber II](https://leetcode.com/problems/house-robber-ii/) 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` ```cpp= class Solution { public: int rob(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; if (n == 1) return nums[0]; // 搶第一間,但不搶最後一間的情況 int max1 = helper(nums, 0, n - 1); // 不搶第一間,但搶最後一間的情況 int max2 = helper(nums, 1, n); return max(max1, max2); } int helper(vector<int>& nums, int left, int right) { int rob = 0, notRob = 0; for (int i = left; i < right; ++i) { int temp = rob; rob = max(nums[i] + notRob, rob); notRob = temp; } return rob; } }; ``` :::success - 時間複雜度:$O(N)$ - 空間複雜度:$O(1)$ :::