【代码随想录训练营】【Day 49+】【动态规划-8】| Leetcode 121, 122, 123
【代码随想录训练营】【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] = 0dp[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]