题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路
直接类比斐波那契数列的解题思路--递归思想
解题方法
爬到第 n 阶台阶的方法数等于爬到第 n-1 阶台阶的方法数与爬到第 n-2 阶台阶的方法数之和。因为我们每次只能爬 1 阶或 2 阶,所以从 n-1 阶再爬 1 阶,或者从 n-2 阶再爬 2 阶是唯一的方法。
设 f(n) 表示爬到第 n 阶的方法数,那么有递推公式:
f(n)=f(n−1)+f(n−2) 则其初始条件是:
f(1)=1;f(2)=2
(这一点有别于斐波那契数列)
class Solution { public: int climbStairs(int n) { if(n<=0){return 0;} if(n==1){return 1;} if(n==2){return 2;} int first = 1; int second = 2; int result = 0; for(int i = 3;i <= n; ++i){ result = first+second; first=second; second=result; } return result; } };
复杂度
时间复杂度:
O(n)
空间复杂度:
O(1)