1. Recursive Suffix Exploration with First House Flag
Intuition
Recursively branch at each house, tracking whether the first house was robbed to prevent robbing house n-1.
Algorithm
- Define
dfs(i, robbedFirst). - If
i >= n, return 0. - If
i == n - 1androbbedFirst: cannot rob, return 0. - Option 1: rob house i ->
nums[i] + dfs(i + 2, robbedFirst || (i == 0)). - Option 2: skip house i ->
dfs(i + 1, robbedFirst). - Return max(Option 1, Option 2).
#include <iostream>#include <vector>#include <algorithm> using namespace std; int dfs(int i, bool robbedFirst, const vector<int>& nums) { if (i >= (int)nums.size()) return 0; if (i == (int)nums.size() - 1 && robbedFirst) return 0; int rob = nums[i] + dfs(i + 2, robbedFirst || (i == 0), nums); int skip = dfs(i + 1, robbedFirst, nums); return max(rob, skip);} int robRec(vector<int>& nums) { if (nums.empty()) return 0; if (nums.size() == 1) return nums[0]; return dfs(0, false, nums);} int main() { vector<int> nums = {2, 3, 2}; cout << "Max Robbed (Recursive): " << robRec(nums) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack