【代码随想录训练营】【Day 49+】【动态规划-8】| Leetcode 121, 122, 123
需强化知识点
- 买卖股票系列
题目
121. 买卖股票的最佳时机
- 动态规划
- 贪心:记录左侧的最小值
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# n = len(prices)
# # 0 代表 不持有,1 代表 持有
# dp = [[0]*2 for _ in range(n)]
# dp[0][1] = - prices[0]
# for i in range(1, n):
# dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])
# dp[i][1] = max(dp[i-1][1], -prices[i])
# return dp[n-1][0]
lowPrice = float('inf')
result = 0
for i in range(0, len(prices)):
lowPrice = min(lowPrice, prices[i])
result = max(result, prices[i]-lowPrice)
return result
122. 买卖股票的最佳时机 II
- 注意 和 121的区别,在于第 i 天持有的时,dp[i-1][0]-prices[i] (121中默认dp[i-1][0]为0)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 0 不持有, 1 持有
dp = [[0]*2 for _ in range(len(prices))]
dp[0][0] = 0
dp[0][1] = -prices[0]
for i in range(1, len(prices)):
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
return dp[len(prices)-1][0]
123. 买卖股票的最佳时机 III
- 代码随想录思路:0-4 五种状态
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 0 没有操作
# 1 第一次持有股票
# 2 第一次不持有股票
# 3 第二次持有股票
# 4 第二次不持有股票
n = len(prices)
dp = [[0]*5 for _ in range(n)]
dp[0][1], dp[0][3] = -prices[0], -prices[0]
for i in range(1, n):
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
dp[i][2] = max(dp[i-1][2], dp[i-1][1]+prices[i])
dp[i][3] = max(dp[i-1][3], dp[i-1][2]-prices[i])
dp[i][4] = max(dp[i-1][4], dp[i-1][3]+prices[i])
return dp[n-1][4]