ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【力扣】买卖股票动态规划总结

【力扣】买卖股票动态规划总结 买卖股票问题对应力扣题目121.买卖股票最佳时机只能买卖一次https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/122.买卖股票最佳时机2无限次买卖https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/123.买卖股票最佳时机3最多进行两笔交易https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/188.买卖股票最佳时机4最多进行k笔交易https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/309.买卖股票含冷冻期卖出股票后有一天的冷冻期不能买入https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/121和122可以利用贪心思路只能买卖一次可以遍历整个price数组记录当前最小买入价格然后每次统计卖出的差值利用变量接受最大差值即可122可以直接求的price数组的整体增值即可。关于限制交易笔数每限制一次就多一对状态第n次持有和第n次不持有来表示即可第n次持有可以从n-1次不持有-price[i]或者之前第n次持有推来第n次不持有可以从n-1次持有price[i]或者之前第n次不持有推来。关于冷冻期要把状态拆分的更细持有不持有保持卖出当天卖出冷冻期。如果不持有状态不拆分冷冻期和持有状态就不好写所以这样更容易理解。1持有状态可以是三个转移而来1一直持有、2保持卖出状态再买入、3冷冻期状态下一天买入2保持卖出状态可以由两个状态而来1一直保持卖出2持有卖出3当天卖出只能由持有卖出4冷冻期只能是当天卖出转移而来。下面是每道题目的详细代码class Solution: def maxProfit(self, prices: List[int]) - int: dp [[0,0] for _ in range(len(prices))] dp[0][0] -prices[0] for i in range(1,len(prices)): dp[i][0] max(dp[i-1][0],-prices[i]) #当前持有由于只能持有一次所以直接是-prece[i] dp[i][1] max(dp[i-1][1],dp[i-1][0]prices[i]) #当前不持有 return dp[-1][1]class Solution: def maxProfit(self, prices: List[int]) - int: dp [[0,0] for _ in range(len(prices))] dp[0][0] -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[-1][1]class Solution: def maxProfit(self, prices: List[int]) - int: dp [[0,0,0,0,0] for _ in range(len(prices))] dp[0][1] -prices[0] dp[0][3] -prices[0] for i in range(1,len(prices)): #dp[0][0]没有用 dp[i][1] max(dp[i-1][1],-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[-1][4]class Solution: def maxProfit(self, k: int, prices: List[int]) - int: dp [[0]*(k*21) for _ in range(len(prices))] for i in range(1,2*k,2): dp[0][i]-prices[0] for i in range(1,len(prices)): for j in range(1,2*k1): if j%21: dp[i][j] max(dp[i-1][j],dp[i-1][j-1]-prices[i]) #第j次持有 else: dp[i][j] max(dp[i-1][j],dp[i-1][j-1]prices[i]) #第j次不持有 return dp[-1][-1]class Solution: def maxProfit(self, prices: List[int]) - int: length len(prices) if length1: return 0 dp [[0]*4 for _ in range(length)] dp[0][0] -prices[0] for i in range(1,length): dp[i][0] max(dp[i-1][0],dp[i-1][1]-prices[i],dp[i-1][3]-prices[i])#持有 dp[i][1]max(dp[i-1][1],dp[i-1][3])#保持卖出 dp[i][2]dp[i-1][0]prices[i]#卖出 dp[i][3]dp[i-1][2]#冷冻 return max(dp[length-1][1],dp[length-1][2],dp[length-1][3]);
返回列表