题目描述
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [2,4,1], k = 2
输出: 2
解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
解法
因为 j 只有 0 和 1 两种状态,则有如下递推关系式:
dp 数组的初始化中,dp[0][1] 无意义,因为这里以买入股票作为开始一次交易,所以不存在 0 次交易,持有股票的情况。
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
if not prices or k<1:
return 0
dp=[[0,-prices[0]] for i in range(k+1)]
for i in range(1,len(prices)):
for k in range(1,k+1):
dp[k][1]=max(dp[k][1],dp[k-1][0]-prices[i])
dp[k][0]=max(dp[k][0],dp[k][1]+prices[i])
return dp[k][0]
因为在该题目的测试用例中,给出的 k 值存在极大数字的情况,考虑到当 时,意味着在该股票价格列表中,可以随意买入和卖出,即相当于不限制次数,所以增加对 k 值的判断。
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
if not prices or k<1:
return 0
if k>len(prices)//2: #相当于不限制交易次数
i0,i1=0,-prices[0]
for i in range(1,len(prices)):
i0=max(i0,i1+prices[i])
i1=max(i1,i0-prices[i])
return i0
dp=[[0,-prices[0]] for i in range(k+1)]
for i in range(1,len(prices)):
for k in range(1,k+1):
dp[k][1]=max(dp[k][1],dp[k-1][0]-prices[i])
dp[k][0]=max(dp[k][0],dp[k][1]+prices[i])
return dp[k][0]
网友评论