This approach involves splitting the problem into two scenarios: robbing from house 0 to house n-2, and from house 1 to house n-1. The aim is to apply the linear version of the House Robber problem to each scenario separately and then take the maximum of the two resulting summed values.
Time Complexity: O(n).
Space Complexity: O(1).
1
2class Solution {
3public:
4 int robLinear(vector<int>& nums, int start, int end) {
5 int prev1 = 0, prev2 = 0;
6 for (int i = start; i < end; i++) {
7 int temp = prev1;
8 prev1 = max(nums[i] + prev2, prev1);
9 prev2 = temp;
10 }
11 return prev1;
12 }
13 int rob(vector<int>& nums) {
14 int n = nums.size();
15 if (n == 1) return nums[0];
16 return max(robLinear(nums, 0, n - 1), robLinear(nums, 1, n));
17 }
18};
19
This C++ solution uses a helper function robLinear
for computing the linear house rob solution and applies it twice: once excluding the first house and once excluding the last house. It returns the maximum of these two values.
This approach implements a memoized version of the dynamic programming solution to avoid recomputing values. We explore two scenarios of the circle, taking into account the cycles explicitly by caching intermediate results.
Time Complexity: O(n).
Space Complexity: O(n) for the memoization array.
1
2var robHelper = function(nums, start, end, memo) {
3 if (start >= end) return 0;
4 if (memo[start] !== undefined) return memo[start];
5 memo[start] = Math.max(nums[start] + robHelper(nums, start + 2, end, memo), robHelper(nums, start + 1, end, memo));
6 return memo[start];
7};
8
9var rob = function(nums) {
10 if (nums.length === 1) return nums[0];
11 const memo1 = {};
12 const memo2 = {};
13 return Math.max(robHelper(nums, 0, nums.length - 1, memo1), robHelper(nums, 1, nums.length, memo2));
14};
15
This JavaScript solution applies memoization utilizing plain objects to store precomputed solutions. The function robHelper
determines the best regular house rob outcomes recursively while updating cache objects accordingly for each scenario considered.