Easy草稿★★★★★O(n) 時間 · O(1) 空間
Dynamic ProgrammingMathMemoization
Patterns📈 線性 DP・Kadane🧮 數學・組合
尚未複習過

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

70Climbing Stairs1-D DPEasy1-D DP

你正在爬一個有 n 階的樓梯,每次可以爬 1 階或 2 階。請問有多少種不同的方式可以爬到頂端?

Example:

Input: n = 3 Output: 3

Intuition

TIP

到第 n 階的方法數 = 到第 n-1 階 + 到第 n-2 階,本質上就是費氏數列。

Approaches

1. Top-Down Memoization — O(n) / O(n)
  • Idea: 遞迴 + 記憶化,從 n 往下拆解到 base case
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun climbStairs(n: Int): Int {
        val memo = IntArray(n + 1) { -1 }
        fun dp(i: Int): Int {
            if (i <= 1) return 1
            if (memo[i] != -1) return memo[i]
            memo[i] = dp(i - 1) + dp(i - 2)
            return memo[i]
        }
        return dp(n)
    }
}
⭐ 2. Bottom-Up with Rolling Variables — O(n) / O(1)
  • Idea: 自底向上迭代,只用兩個變數追蹤前兩個狀態,空間最優
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun climbStairs(n: Int): Int {
        var prev2 = 1
        var prev1 = 1
        for (i in 2..n) {
            val cur = prev1 + prev2
            prev2 = prev1
            prev1 = cur
        }
        return prev1
    }
}

🔑 Takeaways

Ladders 看全部 →

🪜

爬樓梯 / 遞推

費氏遞推的入門與變形。

  1. 1
  2. 2#746Min Cost Climbing StairsEasy每階有成本 → 求最小成本路徑
  3. 3#1137N-th Tribonacci NumberEasy推廣到三階遞推(Tribonacci)