代码随想录算法训练营 day51 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
发布人:shili8
发布时间:2024-11-17 00:26
阅读次数:0
**代码随想录算法训练营 Day51**
### **309. 最佳买卖股票时机含冷冻期**
#### 题目描述:
给定一个数组 `prices`,其中每个元素代表一天的股价。我们需要找到在不超过 `k` 天冷冻期的情况下,最佳的买卖股票时机。
#### 示例:
* 输入:`prices = [1,2,3,0,2], k =2`
输出:`4`
#### 思路:
我们可以使用动态规划来解决这个问题。首先,我们需要定义一个二维数组 `dp`,其中 `dp[i][j]` 表示在第 `i` 天结束时,最大利润为 `j` 的买卖股票时机。
然后,我们遍历每一天的股价,并根据当前价格与前几天的价格比较来更新 `dp` 数组。具体来说,如果当前价格高于前几天的价格,则我们可以在当前天开始一个新的交易周期;否则,我们保持当前天的利润不变。
####代码:
def maxProfit(prices, k): n = len(prices) # 如果没有限制,直接使用动态规划求解 if k >= n //2: return sum(x - y for x, y in zip(prices[1:], prices[:-1]) if x > y) dp = [[0] * (k +1) for _ in range(n)] # 初始化第一行和第一列 for i in range(1, n): for j in range(1, min(i //2 +1, k +1)): dp[i][j] = max(dp[i -1][j], prices[i] - prices[i - j]) return dp[-1][-1]
### **714.买卖股票的最佳时机含手续费**
#### 题目描述:
给定一个数组 `prices`,其中每个元素代表一天的股价。我们需要找到在不超过 `k` 次交易次数的情况下,最佳的买卖股票时机。
#### 示例:
* 输入:`prices = [1,3,2,8,4,7], k =2`
输出:`6`
#### 思路:
我们可以使用动态规划来解决这个问题。首先,我们需要定义一个二维数组 `dp`,其中 `dp[i][j]` 表示在第 `i` 天结束时,最大利润为 `j` 的买卖股票时机。
然后,我们遍历每一天的股价,并根据当前价格与前几天的价格比较来更新 `dp` 数组。具体来说,如果当前价格高于前几天的价格,则我们可以在当前天开始一个新的交易周期;否则,我们保持当前天的利润不变。
####代码:
def maxProfit(prices, k): n = len(prices) # 如果没有限制,直接使用动态规划求解 if k >= n //2: return sum(x - y for x, y in zip(prices[1:], prices[:-1]) if x > y) dp = [[0] * (k +1) for _ in range(n)] # 初始化第一行和第一列 for i in range(1, n): for j in range(1, min(i //2 +1, k +1)): dp[i][j] = max(dp[i -1][j], prices[i] - prices[i - j]) return dp[-1][-1]
### **总结**
在本文中,我们分别解决了两个问题:309. 最佳买卖股票时机含冷冻期和714.买卖股票的最佳时机含手续费。我们使用动态规划来求解这两个问题,并提供了详细的代码示例和注释。
这些问题需要你对算法和数据结构有深刻理解,特别是动态规划,这是一个非常强大的工具,可以帮助你解决很多复杂的问题。