一、题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
二、示例
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
三、分析
思路:在上第n层台阶时,有两种情况:
(1)从第n-1层台阶迈一步上去;
(2)从第n-2层台阶迈两步上去;
因此,上到第n层台阶的方法数=上到第n-1层台阶的方法数+上到第n-2层台阶的方法数
同理,第n-1,n-2...层台阶的求法同上。
边界:n=1时,一步就能迈上去;
n=2时,可以一步一步迈,也可以两步跨上去。
时间复杂度:循环从1到n,求到达每一层的方法数O(N)
空间复杂度:使用三个变量分别保存n,n-1,n-2;O(1)
四、代码
class Solution {
public:
int climbStairs(int n) {
//n=1,一种方法
if(n==1)return 1;
//记录的是n=2的情况,llast对应n-2,last对应n-1,ans对应n
int llast=1,last=2,ans=2;
for(int i=3;i<=n;i++){
//更新三个变量的值
ans=last+llast;
llast=last;
last=ans;
}
return ans;
}
};