第一种解法:斐波那契数F(n)=F(n-1)+F(n-2)
时间复杂度O(n) 空间复杂度O(1)
java写法
第一种:
public int climbStairs(int n) {
if (n <= 3){
return n;
}
int f1 = 2, f2 = 3, f3 = 4;
for (int i = 4; i < n + 1; ++i){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
第二种(与第一种相比只是参数值不同)
public int climbStairs(int n) {
if (n <= 2){
return n;
}
int f1 = 1, f2 = 2, f3 = 3;
for (int i = 3; i < n + 1; ++i){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
C++解法
int climbStairs(int n) {
if (n <= 2) {
return n;
}
int f1 = 1;
int f2 = 2;
int f3 = 3;
for (int i = 3; i < n + 1; ++i){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
第二种解法:斐波那契数递归解法F(n)=F(n-1)+F(n-2)
时间复杂度O(2^n) 空间复杂度O(n)
public int climbStairs(int n) {
if (n == 1){
return 1;
}
if (n == 2){
return 2;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
第三种解法:动态规划
时间复杂度O(n) 空间复杂度O(1)
C++描述:
int climbStairs(int n) {
int a = 1, b = 1;
while (--n > 0){
a = (b += a) - a;
}
return b;
}
JAVA描述
public int climbStairs(int n) {
int a = 1, b = 1;
while (--n > 0){
a = (b += a) - a;
}
return b;
}
第四种解法:斐波那契公式
public int climbStairs(int n) {
double sqrt_5 = Math.sqrt(5);
double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
return (int)(fib_n / sqrt_5);
}