Skip to content

House Robber II

Medium Day 5 • Striver Blind 75

Houses are arranged in a circle. Return the maximum money you can rob without alerting police.

Example 1:

  • Input: nums = [2,3,2]
  • Output: 3

Constraints:

  • 1 <= nums.length <= 100

Run House Robber I twice: once for nums[0...n-2] and once for nums[1...n-1].

Circular DP Decomposition


📊 Step-by-Step Execution (Mermaid Diagram)

Section titled “📊 Step-by-Step Execution (Mermaid Diagram)”
graph TD
Problem["Problem of Size N"] --> Sub["Break into Subproblems DP[i]"]
Sub --> Base["Base Cases: DP[0], DP[1]"]
Base --> Trans["State Transition: DP[i] = f(DP[i-1], DP[i-2], ...)"]
Trans --> Table["Fill DP Table / Variables"]
Table --> Result["Return DP[N]"]

function rob(nums) {
if (nums.length === 1) return nums[0];
function helper(arr) {
let r1 = 0, r2 = 0;
for (let n of arr) { let t = Math.max(n + r1, r2); r1 = r2; r2 = t; }
return r2;
}
return Math.max(helper(nums.slice(0, nums.length - 1)), helper(nums.slice(1)));
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)
  • Explanation: Splits circle into two linear ranges.

function rob(nums) {
if (nums.length === 1) return nums[0];
function helper(arr) {
let r1 = 0, r2 = 0;
for (let n of arr) { let t = Math.max(n + r1, r2); r1 = r2; r2 = t; }
return r2;
}
return Math.max(helper(nums.slice(0, nums.length - 1)), helper(nums.slice(1)));
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)
  • Explanation: Linear DP on two slices.

  1. Initialize State: Setup necessary pointers, dynamic programming arrays, or hash maps.
  2. Iterate & Evaluate: Process the input according to the boundary conditions.
  3. Update & Return: Compute the optimal answer and return early or at termination.

Since house 0 and house n-1 are adjacent, take max of robbing houses 0..n-2 and 1..n-1.


  1. First and last house cannot be robbed together.

👉 Solve this problem interactively in the DSA Lab