2020年4月5日 星期日

Leetcode題解 Python: 四月挑戰DAY5 Best Time to Buy and Sell Stock II

給一串價格數列,要求出最大利潤(先買後賣)為多少?

這題沒有涵蓋手續費,所以變得超簡單。

在價格遞增的時候不斷獲利,在價格遞減的時候不出手。所謂獲利就是一買一賣且賺錢的。

爬到價格巔峰的過程,每個階梯的高度加總就是最高到最低的差距,於是只要不斷地後減前再加到獲利。

當價格走跌時,後減前就變成負值,如果是負值就不做買賣,收益為 0。

整理之後,後減前只要 > 0 就加入,< 0 就跳過。

判斷相當簡單,於是可以濃縮成一句就解決掉了:
class Solution:
    def maxProfit(self, prices: List[int]) -> int:               
        return sum([max(prices[i]-prices[i-1], 0) for i in range(1,len(prices))])


不過真的要買賣,當然是減少進場次數,買要判斷沒有持有,賣要判斷有持有才能進行。
(真實買賣的情況下,減少進場次數是方向,不管有沒有持有,都可以買賣。
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        profit = 0
        if prices:
            isBuy, cost = 0, 0
            lastPrice = prices[0]
            for i in range(1, len(prices)):
                nowPrice = prices[i]
                if lastPrice <= nowPrice and not isBuy: 
                    cost = lastPrice
                    isBuy = 1
                elif lastPrice > nowPrice and isBuy:
                    profit += lastPrice - cost
                    isBuy = 0                        
                lastPrice = nowPrice
            if isBuy: profit += lastPrice - cost
                
        return profit