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

解法一和解法二本质上是一样。

 

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