
初始条件:
f(1) = 1 (只有 1 阶 → 只有 1 种方法)
f(2) = 2 (两阶 → 1+1 或 2)
假设 f(n) 表示爬到第 n 阶楼梯的方法数:
最后一步是 1 阶 → 前面已经爬到第 n-1 阶 → 有 f(n-1) 种方法
最后一步是 2 阶 → 前面已经爬到第 n-2 阶 → 有 f(n-2) 种方法
所以状态转移方程是:f(n)=f(n−1)+f(n−2)
方法 1:递归(指数级时间复杂度)
时间复杂度:O(2^n)
空间复杂度:O(n)(递归栈)
python
class Solution:
def climbStairs(self, n: int) -> int:
# 最后一步是 1 阶 → 前面已经爬到第 n-1 阶 → 有 f(n-1) 种方法
# 最后一步是 2 阶 → 前面已经爬到第 n-2 阶 → 有 f(n-2) 种方法
# f(n)=f(n−1)+f(n−2)
# 递归
if n==1:
return 1
if n==2:
return 2
return self.climbStairs(n-1) + self.climbStairs(n-2) # class中自己调自己,加self
超时
方法2: 动态规划
时间复杂度:O(n)
空间复杂度:O(1)
python
class Solution:
def climbStairs(self, n: int) -> int:
# 最后一步是 1 阶 → 前面已经爬到第 n-1 阶 → 有 f(n-1) 种方法
# 最后一步是 2 阶 → 前面已经爬到第 n-2 阶 → 有 f(n-2) 种方法
# f(n)=f(n−1)+f(n−2)
# 动态规划 时间复杂度:O(n), 空间复杂度:O(1)
if n==1:
return 1
if n==2:
return 2
# 对第3层台阶来说
prev2 = 1 # 上一步走了2步,还能再走1步
prev1 = 2 # 上一步走了1步,还能再走2步
for cur_floor in range(3, n+1): #从第3层台阶开始,往上走到第n层台阶
current = prev1 + prev2 # 前阶的走法数 f(n)=f(n−1)+f(n−2)
prev2 = prev1 # 对下一层台阶来说,cur_floor的f(n-1)是:下一层台阶的f(n-2)走法
prev1 = current # 对下一层台阶来说,cur_floor是f(n-1)的走法
return current