【編程題】【leetcode】股票問題 - 學一套走天下

知識點:數組操作

 

類似題目:

901    股票價格跨度        3    31.4%    中等    
121    買賣股票的最佳時機        46    50.4%    簡單    
122    買賣股票的最佳時機 II        43    55.0%    簡單    
123    買賣股票的最佳時機 III        17    39.0%    困難    
309    最佳買賣股票時機含冷凍期        13    49.3%    中等    
188    買賣股票的最佳時機 IV        8    28.0%    困難    
714    買賣股票的最佳時機含手續費        6    54.5%    中等    
502    IPO        6    35.4%    困難    

 

以【leetcode123】舉例,使用以下方法一招通吃,困難變easy(OVO)

思路:

設置兩維dp,dp[n][4],四個值分別表示:

0:買入第一個股票,第0時初始化爲股票的價格的負數

1:賣出第一個股票,第0時不能賣出,所以初始化爲0

2:買入第二個股票,第0時初始化爲股票的價格的負數,因爲最多買兩次,可以只買一次,所以在第0時也要初始化

3:賣出第二個股票,第0時不能賣出,所以初始化爲0

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if not prices:
            return 0
        dp = [[float('-inf')] * 4 for _ in range(len(prices))]
        dp[0] = [-1 * prices[0], 0, -1 * prices[0], 0]
        for i in range(1, len(prices)):
            dp[i][0] = max(0 - prices[i], dp[i-1][0])
            dp[i][1] = max(dp[i-1][0] + prices[i], dp[i-1][1])
            dp[i][2] = max(dp[i-1][1] - prices[i], dp[i-1][2])
            dp[i][3] = max(dp[i-1][2] + prices[i], dp[i-1][3])
        # print(dp)
        return max(dp[-1])

 

【leetcode502】股票問題變種

使用DP可以解決,但在最後一個用例會出現超出內存與超時問題,超出內存使用滾動數組,超時問題暫未解決

NOTE:本題不再有時間序列,所以要對兩個輸入列表按照啓動資金x[1]從低到高排序,x[0]是否排序都可以

        zipa = zip(Profits, Capital)
        zipa.sort(key = lambda x: [x[1], -x[0]]) 
        
        k = min(k, len(zipa))
        dp = [[W] + [float('-inf')] * k for _ in range(2)]
        dp[0] = [W] * (k+1)
        for i in range(1, len(zipa) + 1):
            for ki in range(1, k+1):
                if dp[(i-1) % 2][ki-1] >= zipa[i-1][1]:
                    dp[i % 2][ki] = max(dp[(i-1) % 2][ki], dp[(i-1) % 2][ki-1] + zipa[i-1][0])
                else:
                    dp[i % 2][ki] = dp[(i-1) % 2][ki]
        # print(dp)
        return max(max(dp))

 

另外leetcode一篇題解:

和本文思想差不多。還沒有仔細閱讀,先記錄在這兒:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章