題目描述:給定一個整數陣列 prices,其中 prices[i] 表示第 i 天的股票價格。每天可以選擇買入或賣出股票,但手中最多持有一股(買入前必須先賣出)。可以進行無限次交易,求能獲得的最大利潤。
解題思路:使用貪心策略。觀察關鍵性質:只要明天價格比今天高,今天就應該買入、明天賣出。這等同於「收集所有連續上漲段的利潤」。
若將每天的價差 prices[i] - prices[i-1] 列出,最大利潤就是所有正值價差的總和。這是因為任何一段連續上漲(如第1天→第3天)可以分解為多個單日上漲(第1→2天 + 第2→3天),利潤相同。因此只需一次線性掃描,累加所有正值差即可。
時間複雜度:O(n) — 只需對陣列進行一次線性掃描,n 為天數。
空間複雜度:O(1) — 只使用一個累加變數,不需要額外的資料結構。
1. Initialize profit = 0 2. For each day i from 1 to n-1: a. Compute diff = prices[i] - prices[i-1] b. If diff > 0, add diff to profit 3. Return profit
方法一:動態規劃
定義 dp[i][0] 為第 i 天不持股的最大利潤,dp[i][1] 為持股的最大利潤。轉移方程:dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]),dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])。時間複雜度 O(n),空間複雜度可壓縮至 O(1),但常數比貪心大。
方法二:峰谷法(Peak-Valley)
找到所有「谷底買入、峰頂賣出」的交易對。遍歷陣列,遇到谷底(prices[i] < prices[i+1])記錄買入點,遇到峰頂(prices[i] > prices[i+1])記錄賣出點,累加每筆交易的利潤。時間複雜度 O(n),邏輯較繁瑣但直覺上與實際交易操作一致。
fee,如何修改解法使利潤最大化?(LeetCode 714)k 筆交易,解法需要如何改變?(LeetCode 188)