返回
算法实战:LeetCode 309. 最佳买卖股票的时机(包含冷冻期)
后端
2023-10-29 16:19:53
算法实战: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. 最佳买卖股票的时机(包含冷冻期)是一道经典的算法题,考察的是动态规划的思想。通过本文的讲解,相信您已经掌握了这道题的解题思路和代码实现。希望本文对您有所帮助。