70. 爬楼梯
目录
一、问题描述
二、解题思路
三、代码
四、复杂度分析
一、问题描述
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
二、解题思路
📌 举例分析:
-
n = 1
→ 只有一种走法:[1]
-
n = 2
→ 两种走法:[1,1]
,[2]
-
n = 3
→ 三种走法:[1,1,1]
,[1,2]
,[2,1]
-
n = 4
→ 五种走法:[1,1,1,1]
,[1,1,2]
,[1,2,1]
,[2,1,1]
,[2,2]
发现没?它的规律如下:
f(n)=f(n−1)+f(n−2)f(n) = f(n - 1) + f(n - 2)f(n)=f(n−1)+f(n−2)
意思是:
-
如果最后一步是走 1 阶,那前面就是
f(n-1)
种走法; -
如果最后一步是走 2 阶,那前面就是
f(n-2)
种走法。
三、代码
class Solution {
public:int climbStairs(int n) {// 如果台阶数为1或2,直接返回n(因为1阶1种方法,2阶2种方法)if (n <= 2) return n;int prev2 = 1; // 表示到达第1阶的方法数int prev1 = 2; // 表示到达第2阶的方法数int current; // 当前阶数的方法数,初始未定义// 从第3阶开始,依次推算到第n阶for (int i = 3; i <= n; ++i) {current = prev1 + prev2; // 第i阶的走法 = 第(i-1)阶 + 第(i-2)阶prev2 = prev1; // 更新 prev2 为上一轮的 prev1prev1 = current; // 更新 prev1 为当前结果}// 最终返回的是第n阶的走法总数return current;}
};
四、复杂度分析
时间复杂度 | O(n) |
空间复杂度 | O(1) |