Leetcode練習(Python):數組類:第123題:給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。 注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。


題目:給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。  設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。  注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
思路:自己的思路是每逢可以交易的條件就進行交易,沒有考慮全局。結果一直不對,參考網上一個大神的程序,講解的非常明白,如程序1,自己的思路如程序2。
程序1:
class Solution:
    def maxProfit(self, prices):
        if prices==[]:
            return 0
        length=len(prices)
        #結束時的最高利潤=[天數][是否持有股票][賣出次數]
        dp=[ [[0,0,0],[0,0,0] ] for i in range(0,length) ]
        #第一天休息
        dp[0][0][0]=0
        #第一天買入
        dp[0][1][0]=-prices[0]
        # 第一天不可能已經有賣出
        dp[0][0][1] = float('-inf')
        dp[0][0][2] = float('-inf')
        #第一天不可能已經賣出
        dp[0][1][1]=float('-inf')
        dp[0][1][2]=float('-inf')
        for i in range(1,length):
            #未持股,未賣出過,說明從未進行過買賣
            dp[i][0][0]=0
            #未持股,賣出過1次,可能是今天賣的,可能是之前賣的
            dp[i][0][1]=max(dp[i-1][1][0]+prices[i],dp[i-1][0][1])
            #未持股,賣出過2次,可能是今天賣的,可能是之前賣的
            dp[i][0][2]=max(dp[i-1][1][1]+prices[i],dp[i-1][0][2])
            #持股,未賣出過,可能是今天買的,可能是之前買的
            dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0])
            #持股,賣出過1次,可能是今天買的,可能是之前買的
            dp[i][1][1]=max(dp[i-1][0][1]-prices[i],dp[i-1][1][1])
            #持股,賣出過2次,不可能
            dp[i][1][2]=float('-inf')
        return max(dp[length-1][0][1],dp[length-1][0][2],0)
程序2:
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        if length <= 1:
            return 0
        buy = prices[0]
        auxiliary= [0] * length
        mark = 0
        for index in range(1, length):
            if prices[index - 1] >= prices[index]:
                mark += 1
                buy = prices[index]
                auxiliary[index] = prices[index] - buy
                continue
            elif prices[index - 1] < prices[index]:
                buy = min(buy, prices[index])
                auxiliary[index] = prices[index] - buy

        if mark <= 1:
            auxiliary.sort()
            result = auxiliary[length - 1]
        else:
            auxiliary.sort()
            result = auxiliary[length - 1] + auxiliary[length - 2]
        return result


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 Leetcode練習(Python):數組類:第122題:給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 Leetcode練習(Python):數組類:第121題:給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易(即買入和賣出一支股票一次),設計一個算法來計算你所能獲取的最大利潤。 注意:你不能在買入股票前賣出股票。 風口之下,豬都能飛。當今中國股市牛市,真可謂“錯過等七年”。 給你一個回顧歷史的機會,已知一支股票連續n天的價格走勢,以長度為n的整數數組表示,數組中第i個元素(prices[i])代表該股票第i天的股價。 假設你一開始沒有股票,但有至多兩次買入1股而后賣出1股的機會,並且買入前一定要先保證手上沒有股票。若兩次交易機會都放棄,收益為0。 設計算法,計算你能獲得的最大收益。 輸入數值范圍:2<=n< Leetcode練習(Python):第303題:區域和檢索 - 數組不可變:給定一個整數數組 nums,求出數組從索引 i 到 j (i ≤ j) 范圍內元素的總和,包含 i, j 兩點。 Leetcode練習(Python):第349題:兩個數組的交集:給定兩個數組,編寫一個函數來計算它們的交集。 Leetcode練習(Python):第485題:最大連續1的個數:給定一個二進制數組, 計算其中最大連續1的個數。 Leetcode練習(Python):數組類:第189題:給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。 Leetcode練習(Python):第448題:找到所有數組中消失的數字:給定一個范圍在 1 ≤ a[i] ≤ n ( n = 數組大小 ) 的 整型數組,數組中的元素一些出現了兩次,另一些只出現一次。 Leetcode練習(Python):數組類:第73題:給定一個 m x n 的矩陣,如果一個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地算法。 leetcode刷題之 給定兩個數組,寫一個方法來計算它們的交集。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM