题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
思路:
要上到第一节楼梯:一次一步 1
要上到第二节楼梯:两次一步或一次两步 2
要上到第三节楼梯:这样想,他是在第一节楼梯走两步或在第二节楼梯走一步,所以f(3) = f(2) + f(1)
要上到第四节楼梯:在第二节楼梯走两步或在第三节楼梯走一步,f(4) = f(3) + f(2)
…
所以这就是一个斐波那契数列,f(n) = f(n - 1) + f(n - 2)
所以可以这么写:
public int climbStairs(int n) {
if (n <= 2){
return n;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
这种最原始的方法时间复杂度太高,是指数级的,我们需要做优化。
public int climbStairs(int n) {
if (n <= 2){
return n;
}
int f1 = 1;
int f2 = 2;
int f3 = 3;
for (int i = 3; i <= n; ++i){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}