思路
这道题需要求价格最低的一天买进,价格最高的一天卖出,隐含条件就是 买进后才能卖出 。
- 假设数组长度为
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 0min_price, min_index = prices[0], 0max_profit = 0for 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 = ireturn max_profit
