这篇总结一下Leetcode70题的爬楼梯、跳台阶问题,可以用动态规划或者Fibonacci数列解决。
题目大意
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
解法一
打表法,将所有的结果存储在一个数组中,然后查表返回结果。
public void form() {
res[0]=0;res[1]=1;res[2]=2;
for(int i=3;i<100;i++)
res[i]=res[i-1]+res[i-2];
}
public int climbStairs(int n) {
form();
return res[n];
}
运行时间1ms。
解法二
迭代法,类似于Fibonacci,f(n) = f(n-1) + f(n-2)。
public static int climbStairs(int n) {
int a[]={1,2};
if(n<3) return n;
int sum = 0;
for(int i=3;i<=n;i++)
{
sum = a[0]+a[1];
a[0]=a[1];
a[1]=sum;
}
return sum;
}
运行时间1ms。
解法三
Fibonacci的数学公式。
public int climbStairs(int n) {
double sqrt5 = Math.sqrt(5);
double fib = Math.pow((1+sqrt5)/2,n+1)-Math.pow((1-sqrt5)/2,n+1);
return (int)(fib/sqrt5);
}
运行时间1ms。