代码随想录第49天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

80 阅读2分钟

121. 买卖股票的最佳时机

1. first idea

追涨杀跌嘛。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 每一个位置只有卖掉和不卖。

而哪一天买入是由哪一天考虑卖出决定的, 就是在考虑的当天之前最低价格对应的那一天。

但是哪天买入不重要,当天之前的最低价格是多少才重要。

dp[i]表示第i天时能够获得的最大总利润。

不卖,那第i-1天能取得的最大利润是第i天以前能取得的最大利润。

dp[i]=max(price[i]min_price,dp[i1])dp[i]=max(price[i] - min\_price, dp[i - 1])
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [0] * len(prices)
        dp[0] = 0
        min_price = prices[0]
        for idx in range(1, len(dp)):
            min_price = min(prices[idx - 1], min_price)
            dp[idx] = max(prices[idx] - min_price, dp[idx - 1])
        return dp[-1]

2. doc reading

代码随想录 (programmercarl.com)

感觉这次代码随想录的想法太复杂了。

122. 买卖股票的最佳时机 II

1. first idea

只要是递增的相邻两天,我们就买入再卖出,实现只要是涨我们就获利的目的。

这个都不需要动态规划。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        sum_int = 0
        for idx in range(1, len(prices)):
            sum_int += (prices[idx] - prices[idx - 1]) if (prices[idx] - prices[idx - 1]) > 0 else 0
        return sum_int

2. doc reading

用一下动态规划的思路

dp[i][0]表示第i天持有股票,所得最大利润,它应该

  1. 如果前一天持有,和dp[i - 1][0]一致。
  2. 如果前一天不持有,dp[i][0] = dp[i - 1][1] - price[i]

dp[i][1]表示第i天不持有股票,所得最大利润:

  1. 如果前一天持有,现在卖出 dp[i][1] = dp[i - 1][0] + price[i]
  2. 如果前一天也没有,dp[i][1] = dp[i - 1][1]

初始化:dp[0][1] = 0dp[0][0] = -price[0]

结果一定是最后一天且不持有的最大利润。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [[0, 0] for _ in range(len(prices))]
        dp[0][0] = - prices[0]
        for idx in range(1, len(prices)):
            # 持有
            dp[idx][0] = max(dp[idx - 1][0], dp[idx - 1][1] - prices[idx])
            # 不持有
            dp[idx][1] = max(dp[idx - 1][1], dp[idx - 1][0] + prices[idx])
        return dp[-1][1]