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?
» Solve this problem
分析思路与Unique Path一样:
位置n只能由n-1或者n-2到达,假设有f[i]种方法到达位置i,于是:f[n] = f[n - 1] + f[n - 2]。
这就是我们熟悉的斐波拉切数列。
最直接的方法是O(n),有一种利用矩阵的做法,时间复杂度是O(logN)。
构造一个2×2的矩阵:
| 1 1 |
| 1 0 |
| 1 1 | * | f[n-1] | = | f[n - 1] + f[n - 2] | = | f[n] |
| 1 0 | | f[n-2] | | f[n - 1] | | f[n-1] |
所以假设我们要求f[n],只需求出这个2×2的矩阵的n-1次幂,然后乘以一个由f[1], f[0]构成的2×1矩阵。
求幂的过程可以采用二分完成,所以这个算法的复杂度为O(logN)。
不过这题我的代码采用的是最简单的O(n)的算法:
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n == 1 || n == 2) {
return n == 1 ? 1 : 2;
}
int a = 2, b = 1, c;
for (int i = 0; i < n - 2; i++) {
c = a + b;
b = a;
a = c;
}
return a;
}
};