Easy草稿★★★★★O(n) 時間 · O(1) 空間
ArraySliding WindowDynamic Programming
Patterns🪟 滑動視窗
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

121Best Time to Buy and Sell StockSliding WindowEasySliding Window

給定一個整數陣列 prices,其中 prices[i] 代表第 i 天的股票價格。你只能選擇某一天買入,並在之後的某一天賣出,求最大利潤。如果無法獲利則回傳 0

Example:

Input: prices = [7,1,5,3,6,4] Output: 5

Intuition

TIP

追蹤到目前為止的最低買入價,每一天都計算「今天賣出能賺多少」來更新最大利潤。

Approaches

1. Brute Force — O(n²) / O(1)
  • Idea: 嘗試所有 (買入, 賣出) 配對,找出最大利潤
  • Time: O(n²)
  • Space: O(1)
Brute Force Code
class Solution {
    fun maxProfit(prices: IntArray): Int {
        var maxProfit = 0
        for (i in prices.indices) {
            for (j in i + 1 until prices.size) {
                maxProfit = maxOf(maxProfit, prices[j] - prices[i])
            }
        }
        return maxProfit
    }
}
⭐ 2. One Pass (track min price) — O(n) / O(1)
  • Idea: 一次遍歷,持續追蹤最低買入價,並計算當前價格賣出的利潤
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun maxProfit(prices: IntArray): Int {
        var minPrice = Int.MAX_VALUE
        var maxProfit = 0
        for (price in prices) {
            minPrice = minOf(minPrice, price)
            maxProfit = maxOf(maxProfit, price - minPrice)
        }
        return maxProfit
    }
}

🔑 Takeaways

Ladders 看全部 →

📈

買賣股票

從一次交易的貪心,長成多狀態 DP。

  1. 1
  2. 2#122Best Time to Buy And Sell Stock IIMedium可無限次 → 貪心吃下每一段上漲
  3. 3#123Best Time to Buy and Sell Stock IIIHard最多兩次 → 引入交易次數狀態 DP
  4. 4#309Best Time to Buy and Sell Stock with CooldownMedium加入冷卻期 → 多一個 cooldown 狀態
  5. 5