返回
LeetCode 122:股票买卖最佳时机 II
前端
2024-02-04 00:20:35
LeetCode 第 122 题:股票买卖的最佳时机 II 旨在解决一个经典的投资问题:如何在股票价格波动中找到最有利的买卖时机以获得最大收益。题干给定了一个数组 prices,其中 prices[i] 表示第 i 天的股票价格,我们的目标是通过多次买卖股票来计算最大利润。
首先,我们将介绍动态规划算法的一般步骤,以便你更好地理解本文对 LeetCode 122 题的解决方案:
- 明确子问题: 将原问题分解为一系列子问题。在 LeetCode 122 题中,我们的子问题可以是“在第 i 天持有或不持有股票时,所能获得的最大利润是多少?”
- 递归关系: 确定子问题之间的关系,以形成递归公式。在本题中,我们可以通过比较持有股票和不持有股票两种情况下的最大利润来建立递归关系。
- 递推求解: 从最简单的子问题开始,逐渐求解更复杂的问题,直到得到最终结果。对于 LeetCode 122 题,我们可以从第 0 天开始,逐步计算每一天持有或不持有股票的最大利润。
- 边界条件: 确定问题的边界条件,通常是指没有任何子问题的情况。在 LeetCode 122 题中,边界条件是当我们到达数组的末尾时,我们必须卖出股票。
现在,我们来深入探讨 LeetCode 122 题的动态规划算法:
- 初始化: 我们创建一个二维数组 dp,其中 dp[i][0] 表示第 i 天不持有股票的最大利润,dp[i][1] 表示第 i 天持有股票的最大利润。
- 状态转移方程: 对于第 i 天,我们有两种选择:持有股票或不持有股票。如果我们选择持有股票,则第 i 天的最大利润取决于前一天持有股票的最大利润加上当天的股票价格;如果我们选择不持有股票,则第 i 天的最大利润取决于前一天不持有股票的最大利润减去当天的股票价格。
- 递推求解: 我们从第 0 天开始,逐步计算每一天持有或不持有股票的最大利润,直到到达数组的末尾。
- 最终结果: 当我们到达数组的末尾时,我们比较 dp[n][0] 和 dp[n][1],其中 n 是数组的长度,较大者即为最大利润。
通过上述步骤,我们可以计算出在给定的股票价格列表中买卖股票的最大利润。LeetCode 122 题的动态规划算法的时间复杂度为 O(n),其中 n 是数组的长度,空间复杂度为 O(n)。
为了更好地理解算法的运作方式,我们提供一个示例和代码实现:
示例:
股票价格:[7, 1, 5, 3, 6, 4]
算法步骤:
- 初始化:
dp = [[0, 0] 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 - 1])
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i - 1])
- 递推求解:
for i in range(1, len(prices) + 1):
print(f"Day {i}: Hold: {dp[i][1]}, Not Hold: {dp[i][0]}")
- 最终结果:
max_profit = max(dp[len(prices)][0], dp[len(prices)][1])
print(f"Maximum Profit: {max_profit}")
代码实现:
def max_profit(prices):
# 初始化
dp = [[0, 0] 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 - 1])
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i - 1])
# 最终结果
max_profit = max(dp[len(prices)][0], dp[len(prices)][1])
return max_profit
# 示例
prices = [7, 1, 5, 3, 6, 4]
result = max_profit(prices)
print(f"Maximum Profit: {result}")
在本文中,我们详细介绍了 LeetCode 122 题:股票买卖最佳时机 II 的动态规划算法。我们从问题背景出发,阐述了算法的步骤和实现细节。通过示例和代码实现,你可以更好地理解算法的运作方式。希望这篇文章能够帮助你在动态规划和股票买卖问题上取得进步。