給你一個整數數組 prices
,其中 prices[i]
表示某支股票第 i
天的價格。
在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然後在 同一天 出售。
返回 你能獲得的 最大 利潤 。
示例 1:
輸入:prices = [7,1,5,3,6,4] 輸出:7 解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。 隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3 。 總利潤爲 4 + 3 = 7 。
示例 2:
輸入:prices = [1,2,3,4,5] 輸出:4 解釋:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。 總利潤爲 4 。
示例 3:
輸入:prices = [7,6,4,3,1] 輸出:0 解釋:在這種情況下, 交易無法獲得正利潤,所以不參與交易可以獲得最大利潤,最大利潤爲 0 。
提示:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104
【分析】
貪心算法來做。
股票買賣策略:
單獨交易日:假設今天價格p1,明天價格p2,則今天買入,明天賣出可賺取金額p2 - p1(負值代表哦虧損)。
連續上漲交易日:設此上漲交易日股票價格分別爲p1, p2, p3, ..., pn,則第一天買,最後一天賣,收益最大,即pn - p1;等價於每天都買賣,即 pn - p1 = (p2 - p1) + (p3 - p2) + ... + (pn - pn-1)
連續下降交易日:則不賣賣收益最大,即不會虧錢。
算法流程:
遍歷整個股票交易日價格列表price,策略是所有上漲交易日都買賣(賺到所有利潤),所有下降交易都不買賣(用不虧錢)。
1. 設tmp爲第i-1日買入與第i日賣出賺取的利潤,即tmp = prices[i] - prices[i-1];
2. 當該日利潤爲正tmp > 0, 則將利潤加入總利潤profit,當利潤爲0或者爲負,則直接跳過;
3. 遍歷完成後,返回總利潤profit。
class Solution: def maxProfit(self, prices: List[int]) -> int: profit = 0 for i in range(1, len(prices)): # 注意這裏range範圍的寫法 tmp = prices[i] - prices[i - 1] if tmp > 0: profit += tmp return profit
時間複雜度:O(N),只需遍歷一次price;
空間複雜度:O(1),變量使用常數級額外空間。