題目描述:一排房屋,每間有若干金額。不能搶劫相鄰的兩間,求可搶劫的最大金額。
解題思路:對每間房屋,有兩個選擇:搶或不搶。搶第 i 間:得到 nums[i] + dp[i-2](因為不能搶 i-1);不搶:得到 dp[i-1]。狀態轉移:dp[i] = max(nums[i] + dp[i-2], dp[i-1])。只需兩個變數即可完成空間優化。
時間複雜度:O(n) — 單次線性掃描。
空間複雜度:O(1) — 只保留前兩個狀態。
1. If n == 1: return nums[0] 2. prev2 = nums[0], prev1 = max(nums[0], nums[1]) 3. For i from 2 to n-1: a. curr = max(nums[i] + prev2, prev1) b. prev2 = prev1; prev1 = curr 4. Return prev1
遞迴無記憶 O(2^n):嘗試搶或不搶各房,重複計算。
空間優化至 O(1):只追蹤前兩個狀態而非全陣列 — 此即本方法簡化版。