題目描述:給定每日股票價格陣列,最多進行兩次交易(買+賣各算一次),求最大利潤。同一時刻只能持有一股。
解題思路:追蹤四個狀態變數:buy1(第一次買後的最大現金)、sell1(第一次賣後的最大利潤)、buy2(第二次買後的最大現金)、sell2(第二次賣後的最大利潤)。每天更新這四個狀態:buy1 = max(buy1, -price)、sell1 = max(sell1, buy1 + price)、buy2 = max(buy2, sell1 - price)、sell2 = max(sell2, buy2 + price)。
時間複雜度:O(n) — 單次遍歷,每天更新四個常數個狀態。
空間複雜度:O(1) — 只用四個變數。
1. buy1 = INT_MIN, sell1 = 0, buy2 = INT_MIN, sell2 = 0 2. For each price: a. buy1 = max(buy1, -price) // best cash after 1st buy b. sell1 = max(sell1, buy1 + price) // best profit after 1st sell c. buy2 = max(buy2, sell1 - price) // best cash after 2nd buy d. sell2 = max(sell2, buy2 + price) // best profit after 2nd sell 3. Return sell2
DP 二維狀態 O(n × k):dp[i][j][0/1] = 第 i 天第 j 次交易持/不持股的最大利潤 — 更通用,可解 k 次交易(LC 188),但空間 O(n × k)。
前後綴分割 O(n):預計算每個分割點左邊一次交易最大利潤 + 右邊一次交易最大利潤,線性掃描取最大 — 等效但實作較繁。