返回

算法实战:LeetCode 309. 最佳买卖股票的时机(包含冷冻期)

后端

算法实战:LeetCode 309. 最佳买卖股票的时机(包含冷冻期)

题目:
给定一个价格数组,数组中元素代表每一天的股票价格,现要设计一个算法算出最大利润。在满足以下要求的前提下,可以完成即时交易:

  • 只能在某一天买入股票,在另一天卖出股票。
  • 买入股票后,必须在冷冻期结束后才能再次买入股票。

解题思路:
这道题考察的是动态规划的思想。动态规划是一种解决复杂问题的策略,它将大问题分解成一系列子问题,然后依次解决这些子问题,最终得到大问题的解。

在本题中,我们可以将问题分解成一系列子问题:

  • 在第 i 天之前,不持有股票的最大利润是多少?
  • 在第 i 天之前,持有股票的最大利润是多少?

对于第一个子问题,我们很容易得到答案:在第 i 天之前,不持有股票的最大利润就是第 i 天之前的股票价格的最小值。

对于第二个子问题,我们需要考虑两种情况:

  • 在第 i-1 天持有股票,并于第 i 天卖出。
  • 在第 i-1 天不持有股票,并于第 i 天买入股票。

我们选择两种情况中利润最大的一种,作为第 i 天之前,持有股票的最大利润。

通过以上步骤,我们就可以得到一个长度为 n 的数组 dp,其中 dp[i] 表示在第 i 天之前,最大利润是多少。

代码实现:

def maxProfit(prices):
    """
    :type prices: List[int]
    :rtype: int
    """
    if not prices:
        return 0

    n = len(prices)
    dp = [0] * n

    min_price = prices[0]
    for i in range(1, n):
        min_price = min(min_price, prices[i])
        dp[i] = max(dp[i-1], prices[i] - min_price)

    return dp[-1]

时间复杂度:
该算法的时间复杂度为 O(n),其中 n 是股票价格数组的长度。

空间复杂度:
该算法的空间复杂度为 O(n),其中 n 是股票价格数组的长度。

结语:
LeetCode 309. 最佳买卖股票的时机(包含冷冻期)是一道经典的算法题,考察的是动态规划的思想。通过本文的讲解,相信您已经掌握了这道题的解题思路和代码实现。希望本文对您有所帮助。