思路
这道题需要求价格最低的一天买进,价格最高的一天卖出,隐含条件就是 买进后才能卖出 。
- 假设数组长度为
n
,则买进有n
种可能,卖出也有n
种可能,由此便得到了 暴力求解 算法。
暴力求解 无非就是两重循环,这里不再赘述。
- 暴力求解没有用到隐含条件,如果加入隐含条件,我们又能得到什么算法呢?我们借助 动态规划 的思路来想,如果第
i
天卖出,我们设dp[i]
为第i
天卖出所获得的利润,则可以得到公式
dp[i] = prices[i] - min_price (if prices[i] > min_price)
dp[i] = 0 (if prices[i] <= min_price)
因为买进后才能卖出,所以 min_price
为第 i
天之前的价格最小值。
- 这样我们就可以通过 一次循环 求出每一天卖出所获得的利润,同时用一个变量来记录最大利润。
注:本题也可以采取从后向前遍历,通过求第 i
天买进的利润,来得到最大利润,思路完全一致,不再给出代码。
python代码
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n < 2:
return 0
min_price, min_index = prices[0], 0
max_profit = 0
for i in range(1, n): # 循环求出第i天卖出所获得的利润
if prices[i] > min_price: #当天价格高,可以卖出,更新最大利润
max_profit = max(max_profit, prices[i]-min_price)
else: # 当天价格低,不能卖,所以不需要更新最大利润。更新最小价格
min_price = prices[i]
min_index = i
return max_profit