爬台阶问题

跳台阶问题:一个台阶总共有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 。
容易看出,其实这就是一个斐波那契数列。

递归:时间复杂度为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种。

具体见参考。


参考:http://blog.csdn.net/arrow_pig/article/details/6191496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值