算法現在就是大廠、外企的硬指標。開發、測開、測試,想往上總是繞不開的。
題目描述
難度:【簡單】 標籤:【數組】、【動態規劃】
給定一個數組 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_price
與max_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