返回
轻松攻克 LeetCode 121:买卖股票的最佳时机
前端
2023-12-17 22:23:32
引言
交易股票是一门充满风险和机遇的艺术,想要从中获利需要敏锐的眼光和深厚的分析能力。在 LeetCode 121 题中,你将面临一个经典的股票交易问题:给定一组股票的价格序列,如何找出买卖股票的最佳时机,以获得最大的利润?
算法原理
解决 LeetCode 121 题的关键在于理解动态规划的思想。动态规划是一种自底向上的算法,它将问题分解成一系列子问题,然后逐步解决这些子问题,最终得到整体问题的最优解。
对于 LeetCode 121 题,我们可以定义一个状态转移方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], -prices[i])
其中:
dp[i][0]
表示在第i
天结束时持有股票的最大利润dp[i][1]
表示在第i
天结束时不持有股票的最大利润prices[i]
表示第i
天的股票价格
算法实现
使用动态规划解决 LeetCode 121 题的 Python 实现如下:
def maxProfit(prices):
dp = [[0] * 2 for _ in range(len(prices) + 1)]
for i in range(1, len(prices) + 1):
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], -prices[i])
return dp[-1][0]
时间复杂度
动态规划算法的时间复杂度为 O(n)
, 其中 n
为股票价格序列的长度。
空间复杂度
动态规划算法的空间复杂度为 O(n)
, 其中 n
为股票价格序列的长度。
示例
考虑以下股票价格序列:[7, 1, 5, 3, 6, 4]
。使用我们的算法,我们可以得到以下动态规划表:
天数 | 持有股票 | 不持有股票 |
---|---|---|
1 | 0 | 0 |
2 | 0 | -1 |
3 | 4 | -1 |
4 | 4 | -3 |
5 | 7 | -3 |
6 | 7 | -4 |
因此,在第 6 天结束时,持有股票的最大利润为 7 美元。
结论
通过深入解析动态规划思想,我们可以轻松解决 LeetCode 121 题。掌握动态规划技术不仅可以帮助你解决算法难题,更能让你深入理解编程问题的本质。希望这篇博客能为你带来启发,帮助你成为一名更出色的算法工程师。