iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-刷題不只是刷題

圖解LeetCode(入門篇)系列 第 28

圖解LeetCode(入門篇): 121. Best Time to Buy and Sell Stock

  • 分享至 

  • xImage
  •  

121. Best Time to Buy and Sell Stock

題目描述

給定一個陣列 prices,其中 prices[i] 表示某支股票在第 i 天的價格。你只能選擇在某一天買入這支股票,並在未來的某一天賣出,且買入日與賣出日必須不同。請求出你可以獲得的最大利潤。如果無法獲得任何利潤,則返回 0

Example:
https://ithelp.ithome.com.tw/upload/images/20240906/20168306XXz8Kz5k9W.jpg
Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: 在第 2 天以價格 1 買入,在第 5 天以價格 6 賣出,獲利為 6 - 1 = 5
注意,不能在第 2 天買入後於第 1 天賣出,因為必須在買入之後才能賣出。

解題思路:
這題是模擬股票買賣中如何找到最大利潤的問題。由於題目規定只能買賣一次,所以解題的關鍵在於找到最低的買入價格,並在每一天的價格中計算當前價格與最低買入價格的差值,然後不斷更新最大利潤。具體來說,我們需要遍歷價格列表,依次找到當前最小的價格,並計算出當天賣出時的潛在利潤,將這個潛在利潤與已經記錄的最大利潤相比,更新最大的值。
https://ithelp.ithome.com.tw/upload/images/20240906/201683069eRtSjkTv7.jpg

var maxProfit = function(prices) {
    if (prices.length === 0) return 0;

    let minPrice = prices[0];
    let maxProfit = 0;

    for (let i = 1; i < prices.length; i++) {
        if (prices[i] < minPrice) {
            minPrice = prices[i];
        } else {
            maxProfit = Math.max(maxProfit, prices[i] - minPrice);
        }
    }

    return maxProfit;
};

時間複雜度為 O(n),因為我們只需要遍歷一次 prices 陣列來找出最大利潤。
空間複雜度為 O(1),因為只需要使用常數空間來儲存 minPricemaxProfit 這兩個變數,不會額外佔用其他空間。

總結:
這道題目可以歸類為「for 迴圈」。在 LeetCode 上,與股票買賣相關的題目總共有四題,根據不同的買賣條件,難度和解法也會有所不同。這題只允許進行一次買賣,所以難度屬於 Easy 等級。而下一題允許多次買賣,難度就提升到 Medium 等級。不論如何,讀者可以試著畫出股價的變化圖,觀察如何找到最大利潤,這樣自然就能想出用程式解決的方式。

這些股票題目不僅鍛鍊我們的邏輯思維,還讓我們學會如何有效利用變量來記錄和更新數據,進而找到最優解。對於入門來說,建議從最簡單的情況開始練習,逐步加深對問題的理解。


上一篇
圖解LeetCode(入門篇): 119. Pascal's Triangle II
下一篇
圖解LeetCode(入門篇): 125. Valid Palindrome
系列文
圖解LeetCode(入門篇)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言