Problem

You are a robber on a street. Adjacent houses have alarms — you can’t rob two adjacent. Maximize loot.

Example

Input:  [2,7,9,3,1]
Output: 12
Rob houses 0, 2, 4: 2+9+1.

Solution

DP: rob[i] = max(rob[i-1], rob[i-2] + nums[i]). Compress to two variables for O(1) space.

def rob(nums):
    prev, curr = 0, 0
    for n in nums:
        prev, curr = curr, max(curr, prev + n)
    return curr
function rob(nums) {
    let prev = 0, curr = 0;
    for (const n of nums) {
        [prev, curr] = [curr, Math.max(curr, prev + n)];
    }
    return curr;
}
int rob(vector<int>& nums) {
    int prev = 0, curr = 0;
    for (int n : nums) {
        int next = max(curr, prev + n);
        prev = curr;
        curr = next;
    }
    return curr;
}
public int rob(int[] nums) {
    int prev = 0, curr = 0;
    for (int n : nums) {
        int next = Math.max(curr, prev + n);
        prev = curr;
        curr = next;
    }
    return curr;
}

Complexity

  • Time: O(n)
  • Space: O(1)

Explanation

At each house, decide: skip and keep previous max, OR rob this house plus max from two houses ago. Track only the last two values.

Share this article

Comments

Join the discussion. Got a question, found an issue, or want to share your experience?

Leave a Comment

Your email stays private. We just use it for replies.

Nothing to preview yet.

Use **bold**, *italic*, `code`, ```code blocks```, [link](url), > quote, - list