LSGO——LeetCode實戰(貪心算法系列):122題 買股票最佳時機||(Best Time to Buy and Seell Stock ||))

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

設計一個算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

解法一: 

profit記錄總利潤,a記錄一次買賣的利潤。

  • 如果第二天的價格比第一天低,則在第一天將股票賣出,並計算之前的總利潤。
  • 繼續遍歷,如果第二天的價格比第一天高,則在第一天買入股票,接着如果第三天的價格比第二天的價格還高,則不賣出,繼續持有股票,並計算此時的利潤。如果第三天的價格比第二天低,則進行上一步的操作。

注意:

整個思路的關鍵是第二天減去第一天的價格是虧本還是盈利。並根據是否盈利選擇是否買賣股票。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        profit=0
        a =0
        for i in range(len(prices)-1):
            if  prices[i+1] - prices[i]<0:
                profit +=a
                a=0
            else:
                a += prices[i+1] - prices[i]
        profit += a
        return profit

解法二:

解法二相對於解法一,最大的不同是不記錄連續的利潤值,解法二隻記錄谷值和峯值的差來計算利潤,而解法一,是連續記錄盈利值。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        i = 0
        profit = 0
        while( i < len(prices)-1):
            while(i < len(prices)-1 and prices[i] >= prices[i+1]):  # 尋找谷底
                i +=1
            valley = prices[i]
            while(i < len(prices)-1 and prices[i] <= prices[i+1]):  #尋找鄰近的峯頂
                i +=1
            peak = prices[i]
            profit += peak-valley
        return profit

解法一和解法二本質上是一樣。

 

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