来自力扣的一道简单算法题
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
点击进入原题地址为:爬楼梯
解题思路(我个人的解题思路,可能会有些错误的地方,请见谅):
通过简短计算,我们可以知道
1 个台阶,有 1 种方法
2 个台阶,有 2 种方法
3 个台阶,有 3 种方法
4 个台阶,有 5 种方法
5 个台阶,有 8 种方法
6 个台阶,有 13 种方法
. . . . . . . . .
1,2,3,5,8,13 ....
如果有对这段数字很敏感的人,可能已经反应过来了,这就是斐波那契数列!
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89 . . ..
这个数列从第3项开始,每一项都等于前两项之和。
当:
则通项公式为:
根据定义,我们可以有两种方法来做这题
1. 公式法
n 的值为: 1,2,3,4,5,6,7 . . . .
题目是算出的数列: 1,2,3,5,8,13 . . . .
斐波那契数列: 1,1,2,3,5,8,13,21,34,55,89 . . . .
因为n是从1开始的,得将 n 加上 1
代码如下 :
public static int climbStairs(int n) {
n++;
double count = 1 / Math.sqrt(5) * (Math.pow((1 + Math.sqrt(5)) / 2, n) - Math.pow((1 - Math.sqrt(5)) / 2, n));
return (int) count;
}
2. 循环求和法
通过定义:数列从第3项开始,每一项都等于前两项之和。
我们可以这样写
代码如下:
public static int climbStairs(int n) {
// 0 1 2 3 4 5 6 7 8 ....
// 1 1 2 3 5 8 13 21 34 ....
// 当索引大于1的时候,也就是大于等于2的时候,前两个楼梯数量的方法种数的和等于当前楼梯数量的方法种数。即 V(n-2) + V(n-1) = V(n)
if (n > 1) {
int a = 1; // 存储 V(n-2)
int b = 1; // 存储 V(n-1)
int c = 0; // c的初始值无所谓,用来存储值的 V(n)
for (int i = 1; i < n; i++) {
c = a + b; // c 便是第n阶楼梯对应的方法种数
a = b;
b = c;
}
return c;
}
return n;
}