该题目和以下题目相关联,感兴趣的小伙伴可直接点击下面的链接!
LeetCode121:买卖股票的最佳时机
LeetCode122:买卖股票的最佳时机 II
LeetCode123:买卖股票的最佳时机 III
LeetCode188:买卖股票的最佳时机 IV
LeetCode309:最佳买卖股票时机含冷冻期
LeetCode714:买卖股票的最佳时机含手续费
目录
一、题目
二、示例
三、思路
四、代码
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入:k = 2, prices = [3,2,6,5,0,3]
输出:7
解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
提示:
设置一个二位数组 dp[x][y],x: 交易次数,y: 股票状态 0 or 1, 分别表示卖出/买入
初始状态 dp [[0, -9223372036854775807], [0, -9223372036854775807], [0, -9223372036854775807]] 第 k 次卖出股票 - 当天卖出股票 dp[j][0] = dp[j][1] + prices[i] - 前几天卖出股票 dp[j][0] = dp[j][0] 第 k 次买入股票 - 当前买入股票 dp[j][1] = dp[j - 1][0] - prcies[i] - 前几买入股票 dp[j][1] = dp[j][1]
import sys
class Solution:
def maxProfit(self, k: int, prices) -> int:
"""
:param k: int
:param prices: List[int]
:return: int
"""
"""
dp[x][y]: 二维数组
- x: 交易次数
- y: 股票状态 0 or 1, 分别表示卖出/买入
初始状态 dp
[[0, -9223372036854775807],
[0, -9223372036854775807],
[0, -9223372036854775807]]
第 k 次卖出股票
- 当天卖出股票 dp[j][0] = dp[j][1] + prices[i]
- 前几天卖出股票 dp[j][0] = dp[j][0]
第 k 次买入股票
- 当前买入股票 dp[j][1] = dp[j - 1][0] - prcies[i]
- 前几买入股票 dp[j][1] = dp[j][1]
"""
minnum = -sys.maxsize
dp = [[0, minnum] for _ in range(k + 1)]
for i in range(0, len(prices)):
for j in range(1, k + 1):
dp[j][0] = max(dp[j][0], dp[j][1] + prices[i]) # 卖出
dp[j][1] = max(dp[j][1], dp[j - 1][0] - prices[i]) # 买入
return dp[k][0]
if __name__ == '__main__':
k = 2
# prices = [3, 2, 6, 5, 0, 3]
prices = [2, 4, 1]
s = Solution()
ans = s.maxProfit(k, prices)
print(ans)