最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。 假设阿福已经准确预测出了某只股票在未来 N 天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的价格。 同一天可以进行多次买卖。但是在第一次买入之后,必须要先卖出,然后才可以第二次买入。 现在,阿福想知道他最多可以获得多少利润。
时间: 2024-03-03 10:49:14 浏览: 732
这是一道经典的股票买卖问题,可以使用动态规划来解决。
我们可以用四个变量来表示阿福进行股票买卖的状态:
- buy1: 第一次买入时的最大利润
- sell1: 第一次卖出时的最大利润
- buy2: 第二次买入时的最大利润
- sell2: 第二次卖出时的最大利润
初始时,buy1 和 buy2 的值为负无穷,sell1 和 sell2 的值为零。
对于每一天 i,我们可以根据之前的状态来更新当前状态:
- buy1: 在第 i 天买入的最大利润等于之前的 buy1 和 -prices[i] 中的最大值。
- sell1: 在第 i 天卖出的最大利润等于之前的 sell1 和 buy1 + prices[i] 中的最大值。
- buy2: 在第 i 天第二次买入的最大利润等于之前的 buy2 和 sell1 - prices[i] 中的最大值。
- sell2: 在第 i 天第二次卖出的最大利润等于之前的 sell2 和 buy2 + prices[i] 中的最大值。
最终的答案就是 sell2。
以下是 Python 代码实现:
```python
def max_profit(prices):
buy1, sell1, buy2, sell2 = float('-inf'), 0, float('-inf'), 0
for price in prices:
buy1 = max(buy1, -price)
sell1 = max(sell1, buy1 + price)
buy2 = max(buy2, sell1 - price)
sell2 = max(sell2, buy2 + price)
return sell2
```
时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文