股票买卖问题总结

1. Best Time to Buy and Sell Stock 🔗

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 先暴力

        # summ = 0
        # for i in range(len(prices)-1):
        #     for j in range(i+1, len(prices)):
        #         summ = max(summ, prices[j]-prices[i])
        # return summ

        # 改进版1
        # 维护一个从头开始最小买入值, 记录最大summ
        curMin = prices[0]
        summ = 0
        for i in range(1,len(prices)):
            curMin = min(curMin, prices[i])
            summ = max(summ, prices[i] - curMin)
        return summ

2. Best Time to Buy and Sell Stock II🔗

一下代码运行超时

class Solution:
    # 根据题1进行改编 父问题和子问题相同 采用递归结构 超时
    '''
    def maxProfit(self, prices: List[int]) -> int:
        res = 0
        curMin = prices[0]
        for buy in range(len(prices)):
            curMin = min(curMin, prices[buy])
            res = max(res, self.maxProfit(prices[sell+1:])+prices[sell]-curMin)
        return res
    '''
    # 添加备忘录结构  超时
    def maxProfit(self, prices):
        mome = [-1] * len(prices)
        def dp(start):
            if start >= len(prices): return 0
            if mome[start] != -1: return mome[start]
            # 借鉴题1思路
            res = 0
            curMin = prices[start]
            for sell in range(start+1, len(prices)):
                curMin = min(curMin, prices[sell])
                res = max(res, dp(sell+1)+prices[sell] - curMin)
            mome[start] = res
            return res

        s = dp(0)
        print(mome)
        return s
    
    # 最优算法 贪心
    def maxProfit(self, prices):
        maxProfit = 0
        for i in range(1, len(prices)):
            if prices[i] > prices[i-1]:
                maxProfit += prices[i] - prices[i-1]
        return maxProfit

3. Best Time to Buy and Sell Stock III/IV 🔗

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        memo = dict()
        def dp(start, k): # 加上参数k的限制
            if start >= len(prices): return 0
            if k == 0: return 0
            if (start, k) in memo: return memo[(start,k)]

            res = 0
            curMin = prices[start]

            for sell in range(start+1, len(prices)):
                curMin = min(curMin, prices[sell])
                res = max(res, dp(sell + 1, k - 1) + prices[sell] - curMin)
            memo[(start, k)] = res
            return res
        return dp(0, 2)

4. Best Time to Buy and Sell Stock with Cooldown🔗

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        memo = [-1] * len(prices)
        
        def dp(start):
            if start >= len(prices): return 0
            if memo[start] != -1: return memo[start]
            curMin = prices[start]
            summ = 0
            for sell in range(start+1, len(prices)):
                curMin = min(curMin, prices[sell])
                
                summ = max(summ, dp(start+2)+prices[sell] - curMin)
                
            memo[start] = summ
            
            return summ
        return dp[0]

5. Best Time to Buy and Sell Stock with Transaction 🔗

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        memo = [-1]*len(prices)
        def dp(start):
            if memo[start] !=-1: return memo[start]
            if start >= len(prices): return 0
            
            curMin = prices[start]
            summ = 0
            for sell in range(start, len(prices)):
                curMin = min(curMin, prices[sell])
                summ = max(summ, dp(sell+1)+prices[sell] - curMin - fee)
            memo[start] = curMin
            return curMin
        return dp(0)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值