【leetcode】#陣列【Python】122. Best Time to Buy and Sell Stock II 買賣股票的最佳時機
阿新 • • 發佈:2018-12-18
連結:
題目:
給定一個數組,它的第 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)