【貪心】LeetCode 122. 買賣股票的最佳時機 II【中等】

給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然後在 同一天 出售。

返回 你能獲得的 最大 利潤 。

 

示例 1:

輸入:prices = [7,1,5,3,6,4]
輸出:7
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。
     隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3 。
     總利潤爲 4 + 3 = 7 。

示例 2:

輸入:prices = [1,2,3,4,5]
輸出:4
解釋:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。
     總利潤爲 4 。

示例 3:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 交易無法獲得正利潤,所以不參與交易可以獲得最大利潤,最大利潤爲 0 。

 

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

【分析】

貪心算法來做。

股票買賣策略

  單獨交易日:假設今天價格p1,明天價格p2,則今天買入,明天賣出可賺取金額p2 - p1(負值代表哦虧損)。

  連續上漲交易日:設此上漲交易日股票價格分別爲p1, p2, p3, ..., pn,則第一天買,最後一天賣,收益最大,即pn - p1;等價於每天都買賣,即 pn - p1 = (p2 - p1) + (p3 - p2) + ... + (pn - pn-1)

  連續下降交易日:則不賣賣收益最大,即不會虧錢。

算法流程

  遍歷整個股票交易日價格列表price,策略是所有上漲交易日都買賣(賺到所有利潤),所有下降交易都不買賣(用不虧錢)。

  1. 設tmp爲第i-1日買入與第i日賣出賺取的利潤,即tmp = prices[i] - prices[i-1];

  2. 當該日利潤爲正tmp > 0, 則將利潤加入總利潤profit,當利潤爲0或者爲負,則直接跳過;

  3. 遍歷完成後,返回總利潤profit。

 

 

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        profit = 0
        for i in range(1, len(prices)): # 注意這裏range範圍的寫法
            tmp = prices[i] - prices[i - 1]
            if tmp > 0:
                profit += tmp
        return profit

時間複雜度:O(N),只需遍歷一次price;

空間複雜度:O(1),變量使用常數級額外空間。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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