题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
思路
阶段划分
每天当作一个阶段
状态变量
- 当天的价格,prices[i]prices[i]prices[i]
- 历史最低价格,minPrice[i]minPrice[i]minPrice[i]
- 历史最高利润,maxProfit[i]maxProfit[i]maxProfit[i]
状态变量,满足“后无效性”
状态转移方程
minPrice[i]={minPrice[i−1], if price[i]>minPrice[i−1]price[i], if price[i]≤minPrice[i−1]minPrice[i] = \begin{cases}
& minPrice[i-1], \text{ if } price[i] > minPrice[i-1]\\
& price[i], \text{ if } price[i] \le minPrice[i-1]
\end{cases}minPrice[i]={minPrice[i−1], if price[i]>minPrice[i−1]price[i], if price[i]≤minPrice[i−1]
maxProfit[i]={maxProfit[i−1], if price[i]−minPrice[i]<maxProfit[i−1]price[i]−minPrice[i], if price[i]−minPrice[i]≤maxProfit[i−1]maxProfit[i] = \begin{cases}
& maxProfit[i-1], \text{ if } price[i] - minPrice[i] < maxProfit[i-1]\\
& price[i] - minPrice[i], \text{ if } price[i] - minPrice[i] \le maxProfit[i-1]
\end{cases}maxProfit[i]={maxProfit[i−1], if price[i]−minPrice[i]<maxProfit[i−1]price[i]−minPrice[i], if price[i]−minPrice[i]≤maxProfit[i−1]
代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
max_profit = 0
min_prices = 10**4 + 1
for i in range(n):
if prices[i] < min_prices:
min_prices = prices[i]
profit = prices[i] - min_prices
if profit > max_profit:
max_profit = profit
return max_profit