70. Climbing Stairs
Difficulty: Easy
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1\. 1 step + 1 step
2\. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1\. 1 step + 1 step + 1 step
2\. 1 step + 2 steps
3\. 2 steps + 1 step
Solution
思路1
动态规划, 因为到f(n)
阶的总个数,可以转换为从f(n-2)
或者f(n-1)
阶的方法到达,即是斐波那列公式:F(n) = F(n-1) + F(n-2)
,终止条件:F(1) = 1, F(2) = 2
;第一个台阶1
中方法,到第二个台阶有2
种方法,使用vector代码如下;
Language: C++
class Solution {
public:
int climbStairs(int n) {
if (n < 2) return n;
vector<int> v(n, 1);
v[1] = 2;
for (int i = 2; i < n; i++) {
v[i] = v[i-1] + v[i-2];
}
return v[n-1];
}
};
思路2
思路和上述相同,只是使用stepOne
和stepSec
代替F(n-1)
和F(n-2)
,空间复杂度更优,代码如下:
Language: C++
class Solution {
public:
int climbStairs(int n) {
if (n <= 2) return n;
int stepOne = 1, stepSec = 2, allStep = 0;
for (int i = 2; i < n; i++) {
allStep = stepOne + stepSec;
stepOne = stepSec;
stepSec = allStep;
}
return allStep;
}
};