1. 程式人生 > >【leetcode】#陣列【Python】122. Best Time to Buy and Sell Stock II 買賣股票的最佳時機

【leetcode】#陣列【Python】122. Best Time to Buy and Sell Stock II 買賣股票的最佳時機

連結:

題目:

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個演算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 示例 1: 輸入: [7,1,5,3,6,4] 輸出: 7 解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。 隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。 示例 2: 輸入: [1,2,3,4,5] 輸出: 4 解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。 因為這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。 示例 3: 輸入: [7,6,4,3,1] 輸出: 0 解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

我的解法:寫的超級複雜啊。。遍歷一遍,每次的數字比前面一個數字大,就找最大收益,如果比前面數字小,就準備找下一個收益區間。。 比方 [7, 1, 5, 7, 3, 2, 6, 8, 4] ,希望把這個陣列分為 [7, (1, 5, 7), (3, 2, 6, 8), 4] 幾部分,方法是找先增大後減小的臨界位置。之後,再各個子區間維護最小值和最大收益。

class Solution(object):
    def maxProfit(self, prices):
        if len(prices) == 0:
            return 0
        minnum = prices[0]
        profits = []
        maxflag = False
        for i in range(1,len(prices)):
            if prices[i]<prices[i-1]:
                if maxflag: 
                    profit = maxnum - minnum
                    profits.append(profit)
                    maxflag = False
                minnum = prices[i]
                maxflag = False
            if prices[i] > prices[i-1]:
                maxflag = True
                maxnum = prices[i]
        if maxflag:
            profit = maxnum - minnum
            profits.append(profit)
        if profits == []:
            return 0
        return sum(profits)