美文网首页
股票问题

股票问题

作者: 霍尔元件 | 来源:发表于2019-08-08 14:45 被阅读0次

    发现大佬总结的非常好...

    https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-l-3

    tql...

    第一题: Best Time to Buy and Sell Stock

    只允许发生一次交易

    先想到的是只有一次买入和一次卖出,对于买入的时间和卖出的时间进行讨论就可以得出O(n^2)的算法

    考虑改进 是不是可以只讨论卖出的时间点,而买入的时间点是从开始到卖出时间点这段时间的最小值

    定义变量res表示最大差价 变量premin表示之前的最小值 代码非常清晰

    class Solution(object):
        def maxProfit(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            res = 0
            premin = float("inf")
            
            for n in prices:
                res = max(res, n - premin)
                premin = min(premin, n)
            return res
    

    将六道题的代码给出 解释以后再补

    class Solution(object):
        def maxProfit_one(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            cur0, cur1 = 0, -float("inf"),
            for p in prices:
                cur0 = max(cur0, cur1 + p)
                cur1 = max(cur1, -p) # 如何限制的交易次数 状态1不可以由状态0转变
            return cur0
    
        def maxProfit_any(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            cur0, cur1 = 0, -float("inf")
            for p in prices:
                pre0 = cur0
                cur0 = max(cur0, cur1 + p)
                cur1 = max(cur1, pre0 - p)
            return cur0
    
        def maxProfit_any_cool(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            pre0, cur0, cur1 = 0, 0, -float("inf") # -2 -1 -1 天
            for p in prices:
                temp = cur0  # -1
                cur0 = max(cur0, cur1 + p)
                cur1 = max(cur1, pre0 - p)
                pre0 = temp  # -1 变成 -2 窗口右移
            return cur0
    
        def maxProfit_any_fee(self, prices, fee):
            """
            :type prices: List[int]
            :rtype: int
            """
            cur0, cur1 = 0, -float("inf")
            for p in prices:
                pre0 = cur0
                cur0 = max(cur0, cur1 + p - fee)
                cur1 = max(cur1, pre0 - p)
            return cur0
    
        def mamProfit_2(self, prices):
            dp = [[0] * 2 for _ in range(3)]
            for i in range(3):
                dp[i][1] = -float("inf")
            for i in range(len(prices)):
                for k in [1, 0]:
                    dp[k][0] = max(dp[k][0], dp[k][1] + prices[i])
                    # dp[k][1] = max(dp[k][1], (dp[k - 1][0] if k - 1 >= 0 else 0) - prices[i])
                    dp[k][1] = max(dp[k][1], dp[k - 1][0] - prices[i])
            return dp[1][0]
    
        def maxProfit_K(self, k, prices):
            """
            :type k: int
            :type prices: List[int]
            :rtype: int
            """
            if k > len(prices) // 2:  # 因为内存超出限制 报错
                self.maxProfit_any(prices)
    
            dp = [[0] * 2 for _ in range(k + 1)]
    
            for i in range(k + 1):
                dp[i][1] = -float("inf")
    
            for i in range(len(prices)):
                for j in range(k, 0, -1):
                    dp[j][0] = max(dp[j][0], dp[j][1] + prices[i])
                    dp[j][1] = max(dp[j][1], dp[j - 1][0] - prices[i])
            return dp[k][0]
    

    相关文章

      网友评论

          本文标题:股票问题

          本文链接:https://www.haomeiwen.com/subject/eysxjctx.html