Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources
House Robber II

House Robber II

Problem Statement

The stakes are higher! Houses are now in a circle, so robbing the first and last houses together is off-limits. Maximize your loot without tripping the alarm. This medium-level DP twist adds a circular conundrum—plan your robbery with care!

Example

Input: nums = [2, 3, 2]

Output: 3 (rob 3)

Input: nums = [1, 2, 3, 1]

Output: 4 (rob 1+3)

Input: nums = [1, 2, 3]

Output: 3 (rob 3)

Code

Java
Python
JavaScript
public class Solution {
    public int rob(int[] nums) {
        if (nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];
        return Math.max(robRange(nums, 0, nums.length-2), robRange(nums, 1, nums.length-1));
    }
    private int robRange(int[] nums, int start, int end) {
        int prev = 0, curr = 0;
        for (int i = start; i <= end; i++) {
            int temp = curr;
            curr = Math.max(prev + nums[i], curr);
            prev = temp;
        }
        return curr;
    }
}
            
def rob(nums):
    if not nums:
        return 0
    if len(nums) == 1:
        return nums[0]
    return max(rob_range(nums, 0, len(nums)-2), rob_range(nums, 1, len(nums)-1))

def rob_range(nums, start, end):
    prev, curr = 0, 0
    for i in range(start, end + 1):
        prev, curr = curr, max(prev + nums[i], curr)
    return curr

# Example usage
print(rob([2, 3, 2]))  # 3
print(rob([1, 2, 3, 1]))  # 4
            
function rob(nums) {
    if (!nums.length) return 0;
    if (nums.length === 1) return nums[0];
    return Math.max(robRange(nums, 0, nums.length-2), robRange(nums, 1, nums.length-1));
}

function robRange(nums, start, end) {
    let prev = 0, curr = 0;
    for (let i = start; i <= end; i++) {
        [prev, curr] = [curr, Math.max(prev + nums[i], curr)];
    }
    return curr;
}

// Example usage
console.log(rob([2, 3, 2]));  // 3
console.log(rob([1, 2, 3, 1]));  // 4
            

Explanation

  • DP Insight: Solve two cases: exclude first house or exclude last house, take max.
  • Steps: Use a helper to rob a range, tracking max loot with two variables.
  • Flow Example ([1,2,3,1]): Exclude first: 3, Exclude last: 4 (1+3)—pick 4.
  • Why It Works: Circular constraint splits problem into linear subproblems.

Note

Time complexity: O(n), Space complexity: O(1) with optimized variables. A circular heist mastered!