123.买卖股票的最佳时机III
1.题目
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2.实现
想到要区分第一次交易和第二次交易,但是没有增加状态而仅仅是单独考虑了两个dp数组,所以不清楚怎么讲两个dp数组联系起来
思路提示:增加状态,从持有和未持有增加考虑进第一次买卖和第二次买卖
class Solution:
def maxProfit(self, prices: List[int]) -> int:
#用5种状态来记录操作股票情况,分别为没有操作,第一次买入,第一次卖出,第二次买入,第二次卖出
dp = [0] * 5
dp[1] = -prices[0]
dp[3] = -prices[0]
for u in prices:
# dp[0]无需操作
dp[1] = max(dp[1], -u)
dp[2] = max(dp[2], dp[1] + u)
dp[3] = max(dp[3], dp[2] - u)
dp[4] = max(dp[4], dp[3] + u)
return dp[4]
188.买卖股票的最佳时机IV
1.题目
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
2.实现
基于上一题,这题就轻松多了~
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
length = 2 * k + 1
dp = [0] * length
for i in range(1, length, 2):
dp[i] = -prices[0]
for u in prices:
for i in range(1, length):
if i % 2 != 0: # 第i次买入
dp[i] = max(dp[i], dp[i - 1] - u)
else:
dp[i] = max(dp[i], dp[i - 1] + u)
return dp[length - 1]
写在后面:
上面采用的一维数组,相对dp[i]中小于i的数组都进行了更新,这样理解比较困难,虽然可以ac,但是不建议这么写,可以利用Python等号赋值特点:
dp[0], dp[1] = equal1, equal2
或者建立二维数组进行更新!