1 问题描述及解题思路分析
给定一个数组,其中每个数代表了同一支股票在某一天的价格,天数随索引数的增长而增长,要求找出合适的买点与卖点,使之可以获得最大利润。
这题算是目前刷到过的最简单的题目了,十分钟解决,其实思路很简单:我们从第一天开始买入,储存买入价格为 B B B,同时初始化卖出价格也为当前买入价格 S S S,这样我们计算出的利润 P = 0 P=0 P=0,符合题目要求,也意味着目前获取不到利润,后面的时候,假如有一天的价格 p r i c e s [ i ] prices[i] prices[i]比卖出价格更高,我们令 S = p r i c e s [ i ] S=prices[i] S=prices[i],计算利润为 P = m a x ( P , S − B ) P=max(P,S-B) P=max(P,S−B);假如有一天的价格 p r i c e s [ i ] prices[i] prices[i]比买入价格更低,我们同步更新买入与卖出价格为 S = B = p r i c e s [ i ] S=B=prices[i] S=B=prices[i],因为卖出一定要在买入之后。假如遇到一个更低的价格 B [ k ] B[k] B[k],前面的买入价格 B [ k − 1 ] B[k-1] B[k−1]就可以告一段落了,因为 B [ k ] B[k] B[k]后面的卖出价格减去 B [ k ] B[k] B[k]一定大于减去 B [ k − 1 ] B[k-1] B[k−1]的结果,同时,如果后面没取得更好的利润,我们前面计算过的利润也仍然是保存起来的。
2 代码实现
python代码实现如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
buy = prices[0] # 先定义从第一天买入
sell = prices[0] # 先定义一个卖出价格,为买入价格,这样确保利润为0
profit = 0 # 定义初始利润为0
for price in prices:
if sell < price: # 表明当前价格高于我上一个卖出价格,在这个时刻卖出可以获得更多利润
sell = price
profit = max([sell - buy, profit])
elif price < buy: # 表明出现了更低的买点,这时候要把卖点也更新,因为卖点要在买点之后
buy = price
sell = price
return profit
时间复杂度为 O ( n ) O(n) O(n)。