【LeetCode】121. 買賣股票的最佳時機(一次遍歷)

算法現在就是大廠、外企的硬指標。開發、測開、測試,想往上總是繞不開的。

題目描述

難度:【簡單】 標籤:【數組】、【動態規劃】

給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。

你只能選擇 某一天 買入這隻股票,並選擇在 未來的某一個不同的日子 賣出該股票。

設計一個算法來計算你所能獲取的最大利潤。

返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0 。

題目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

示例

示例 1

輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
     注意利潤不能是 7-1 = 6, 因爲賣出價格需要大於買入價格;同時,你不能在買入前賣出股票。

示例 2

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤爲 0。

解題

暴力破解會有超時風險。

一次遍歷的思路:

在遍歷prices中的每一天價格的時候,如果有一個變量來記錄最小价min_price,那麼就好計算出當前價格可以賺的利潤了。

min_price = float("inf")這裏用到了正無窮,來初始化這個最小价格,因爲價格肯定是正的,具體多少暫時不知道。

開始遍歷,在每一次的遍歷中,用當前的price,與最小价min_price進行比較,取最小的來更新最小价。

然後計算當前這個價格下,可以賺的利潤,用max_profit來存放當前可以賺的利潤,初始化爲 0。
當前價格price - min_pricemax_profit 比較後取最大,更新最大利潤max_profit

當遍歷完成後,返回max_profit即可。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        min_price = float("inf")
        max_profit = 0

        for price in prices:
            min_price = min(min_price, price)
            max_profit = max(max_profit, price - min_price)
        return max_profit

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