跳台阶问题:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。
在这个跳楼梯的题目中,每次可以跳1个台阶或者2个台阶。我们考虑,我们是如何跳到N这个台阶的,一共有两种方式,一种是从N-1台阶跳一个台阶,另外一种是从 N-2跳2个台阶,所以:
F(n) = F(n-1) + F(n-2) 并且 F(1)=1, F(2) = 2 。
容易看出,其实这就是一个斐波那契数列。
这里有一种新的思路:
在这个跳楼梯的题目中,每次可以跳1个台阶或者2个台阶。我们考虑,我们是如何跳到N这个台阶的,一共有两种方式,一种是从N-1台阶跳一个台阶,另外一种是从 N-2跳2个台阶,所以:
F(n) = F(n-1) + F(n-2) 并且 F(1)=1, F(2) = 2 。
容易看出,其实这就是一个斐波那契数列。
递归:时间复杂度为O(n^2)
非递归:时间复杂度为O(n),空间复杂度为O(1)
int Upstairs(int n){
int a=1,b=2,sum=0;
if(n==1|n==2)
return n;
for(int i=2;i<n;i++)
{
sum=a+b;
a=b;
b=sum;
}
return sum;
}
这里有一种新的思路:
仍是看上面的"台阶问题",由登10级台阶所用的步数不同,可以划分为如下的几种情况:
A、共要登10步(全部都是每步登1级):有1种登法;
B、共要登9步(只有某一步登2级,其余每步登1级):有C91=9种登法;
C、共要登8步(只有某两步每步登2级):有C82=28种登法;
D、共要登7步(只有某三步每步登2级):有C73=35种登法;
E、共要登6步(只有某四步每步登2级):有C64=15种登法;
F、共要登5步(全部都是每步登2级):有C55=1种登法;
因此总共的登法有1+9+28+35+15+1=89种。
具体见参考。