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
2var robLinear = function(nums) {
3 let prev1 = 0, prev2 = 0;
4 for (const num of nums) {
5 let temp = prev1;
6 prev1 = Math.max(num + prev2, prev1);
7 prev2 = temp;
8 }
9 return prev1;
10};
11
12var rob = function(nums) {
13 if (nums.length === 1) return nums[0];
14 return Math.max(robLinear(nums.slice(0, nums.length - 1)), robLinear(nums.slice(1)));
15};
16
This JavaScript solution employs a helper function robLinear
leveraging slice function for fresh arrays without the first or last element. It calculates the maximum sum possible in both scenarios and returns the greater value.
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
2#include <string.h>
3
4int memo[101];
5
6int robLinearMemo(int* nums, int start, int end) {
7 memset(memo, -1, sizeof(memo));
8 return robHelper(nums, start, end);
9}
10
11int robHelper(int* nums, int start, int end) {
12 if (start >= end) return 0;
13 if (memo[start] >= 0) return memo[start];
14 memo[start] = (nums[start] + robHelper(nums, start + 2, end) > robHelper(nums, start + 1, end))
15 ? nums[start] + robHelper(nums, start + 2, end) : robHelper(nums, start + 1, end);
16 return memo[start];
17}
18
19int rob(int* nums, int numsSize) {
20 if (numsSize == 1) return nums[0];
21 int case1 = robLinearMemo(nums, 0, numsSize - 1);
22 int case2 = robLinearMemo(nums, 1, numsSize);
23 return (case1 > case2) ? case1 : case2;
24}
25
The C solution sets up a memo
array for memoization to store calculated maximums for each house start index. It runs the helper function robHelper
which recursively looks for the maximum stealing options, caching results for efficiency. It applies this to the scenarios that exclude the first and last house respectively.