Leetcode Link: 剑指 Offer 63. 股票的最大利润 - 力扣(LeetCode) 121. 买卖股票的最佳时机 - 力扣(LeetCode)

题目

解法一

思路: 仔细读题,本题的关键是:只能买卖一次

我们可以采用贪心的策略,遍历每一天,用一个变量保存在当前天之前的最低的价格,然后不断和获得的利润进行比较,保留最大的利润。

题解

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res = 0
        min_price = float('inf')  # 迄今为止的最低价
        for val in prices:
	        # 今天价格更低,则不卖,更新最低价格
            if val < min_price: min_price = val
            # 今天价格高,卖了比较利润
            if val > min_price: res = max(res, val-min_price)
        return res

解法二

思路:动规,暴力搜索,相比较来说有点大材小用了

  • 两个停止条件:1) i 到头了 2) 交易次数用尽
  • 根据当前的持有状态,可以分成买/不买,卖/不卖。

题解

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
	    # i:第i天
	    # stat: 持有状态,1持有,0未持有
	    # times:剩余交易次数,本题times最大为1
        @cache
        def process(i, stat, times):
            if times == 0: 
                return 0
            if i >= len(prices):
                return 0
            
            if stat == 1: # 当前持有
                p1 = process(i+1, stat, times)
                p2 = process(i+1, 0, 0) + prices[i]
            elif stat == 0: # 当前未持有
                p1 = process(i+1, stat, times)
                p2 = process(i+1, 1, times) - prices[i]
            return max(p1, p2)
        
        return process(0, 0, 1)

启发和联系