Easy草稿★★★★★O(n) 時間 · O(1) 空間
Dynamic ProgrammingArray
Patterns📈 線性 DP・Kadane
尚未複習過

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

746Min Cost Climbing Stairs1-D DPEasy1-D DP

給定一個整數陣列 costcost[i] 是從第 i 階往上爬的花費。你可以從第 0 階或第 1 階開始,每次可以爬 1 或 2 階。求到達頂端的最小花費。

Example:

Input: cost = [10,15,20] Output: 15

Intuition

TIP

到達第 i 階的最小花費 = min(從 i-1 來, 從 i-2 來),選較便宜的路徑。

Approaches

1. Bottom-Up DP Array — O(n) / O(n)
  • Idea: 建立長度 n+1 的 DP 陣列,逐步填表
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun minCostClimbingStairs(cost: IntArray): Int {
        val n = cost.size
        val dp = IntArray(n + 1)
        for (i in 2..n) {
            dp[i] = minOf(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
        }
        return dp[n]
    }
}
⭐ 2. Rolling Variables — O(n) / O(1)
  • Idea: 只保留前兩個狀態,空間壓縮到 O(1)
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun minCostClimbingStairs(cost: IntArray): Int {
        var prev2 = 0
        var prev1 = 0
        for (i in 2..cost.size) {
            val cur = minOf(prev1 + cost[i - 1], prev2 + cost[i - 2])
            prev2 = prev1
            prev1 = cur
        }
        return prev1
    }
}

🔑 Takeaways

Ladders 看全部 →

🪜

爬樓梯 / 遞推

費氏遞推的入門與變形。

  1. 1#70Climbing StairsEasy費氏數列:到第 n 階的方法數
  2. 2
  3. 3#1137N-th Tribonacci NumberEasy推廣到三階遞推(Tribonacci)