Framework Thinking - Neetcode 150 - House Robber
Here is solutions for House Robber.
1. Understand the problem
2. Clarify constraints, asks 4 - 5 questions including edge cases.
3. Explore examples.
4. Brainstorm 2 - 3 solutions, naive solution first and optimize later. Explain the key idea of each solution.
5. Implement solutions.
5.1. Recursion - Time O(2^N), Space O(N)
class Solution:
def rob(self, nums: List[int]) -> int:
def dfs(i):
if i >= len(nums):
return 0
return max(dfs(i + 1),
nums[i] + dfs(i + 2))
return dfs(0)
-
Time: O(2^N)
-
Space O(N)
5.2. Dynamic Programming (Top-Down) - Time O(N), Space O(N)
class Solution:
def rob(self, nums: List[int]) -> int:
memo = [-1] * len(nums)
def dfs(i):
if i >= len(nums):
return 0
if memo[i] != -1:
return memo[i]
memo[i] = max(dfs(i + 1), nums[i] + dfs(i + 2))
return memo[i]
return dfs(0)
-
Time: O(N)
-
Space O(N)
5.3. Dynamic Programming (Bottom-Up) - Time O(N), Space O(N)
- dp[i]: maximum value can get from rob at the house[i].
class Solution:
def rob(self, nums: List[int]) -> int:
if not nums:
return 0
if len(nums) == 1:
return nums[0]
dp = [0] * len(nums)
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i in range(2, len(nums)):
dp[i] = max(dp[i - 1], nums[i] + dp[i - 2])
return dp[-1]
-
Time: O(N)
-
Space O(N)
5.4.Dynamic Programming (Space Optimized) - Time O(N), Space 0(1)
class Solution:
def rob(self, nums: List[int]) -> int:
rob1, rob2 = 0, 0
for num in nums:
temp = max(num + rob1, rob2)
rob1 = rob2
rob2 = temp
return rob2
-
Time: O(N)
-
Space O(1)
6. Dry run testcases.
December 7, 2025