C语言练习题之 跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

数据范围:1≤n≤40

要求:时间复杂度:O(n) ,空间复杂度:O(1)

题目分析:

        题目意思比较明了,给定一个台阶数,青蛙每次跳1级或2级,计算有多少种跳法。给定的台阶数是1-40中任意一个数值。

        拿到这个题目,很容易想到递归,只要让青蛙每次跳1级或者跳2级,最后剩下1级的时候就只剩一种跳法,剩下2级就只有2种跳法。让青蛙把所有可能的跳法都跳一遍,最后剩下1级台阶就+1,剩下2级台阶就+2。

        这种思路就是青蛙跳很多次,在每一级台阶都尝试跳1级的结果,同时尝试跳2级的结果。

代码如下:

int jumpFloor(int number)   //函数的输入值是台阶数
{
    if (number == 1)    //如果只有一级台阶,则只有一种跳法,返回1
        return 1;
    if (number == 2)    //如果只有两级台阶,则只有两种跳法,返回2
        return 2;
    return jumpFloor(number - 1) + jumpFloor(number - 2);   
    //剩下台阶数大于2时,让青蛙分别跳一级或者两级,一直跳到只剩下1级,或者只剩下2级。
    //函数一开始会一直执行 jumpFloor(number - 1) 部分,直到只剩下2级台阶,会返回2。
    //前面返回2之后,函数已经计算过这一级的jumpFloor(number - 1)
    //之后继续计算对应的 jumpFloor(number - 2),
    //这时剩下的台阶数是3,(3-2)返回的是 1;
    //再回到上一级,剩下4级台阶,函数同样计算过jumpFloor(number - 1)
    //计算对应的jumpFloor(number - 2),就是(4-2),返回2。
    //依次计算下去,最后在所有可能的路线走完一遍之后,返回的就是所有跳法的总和。
}

        递归的算法容易想,写起来也比较简洁,但是当台阶数比较多的时候,花费的时间太长,不满足题目要求:时间复杂度:O(n) 。

        这时我们需要转变思路,时间复杂度O(n)是与n成线性关系,递归不符合。这就要求从0到n一遍,将所有可能的路线都计算进去。这就需要就将 jumpFloor(number - 1) + jumpFloor(number - 2) 压缩成一个算式,而不是函数。

       为了将上式压缩,需要先理解它的含义。上式是每次计算时,将跳1级和跳2级的可能都跳一遍,如果能做到每一级将前面1级和前面2级的所有可能跳法都加起来,那就可以一遍将所有跳法算出来。

        要将前面1级和前面2级的所有可能跳法都加起来,那就需要从第3级开始计算。

代码如下:

int jumpFloor(int number)	//函数的输入值是台阶数
{
	if (number == 1)	//如果只有一级台阶,则只有一种跳法,返回1
		return 1;
	if (number == 2)	//如果只有两级台阶,则只有两种跳法,返回2
		return 2;
	int i = 0;
	int n1 = 1;		//1级台阶有一种跳法
	int n2 = 2;		//2级台阶有两种跳法
	int total = 0;	//总跳法暂定为0
	for (i = 2; i < number; i++)	//从第3级台阶开始计算,一直到计算完毕
	{
		total = n1 + n2;	//将前面2级n1种跳法和前面1级n2种跳法加起来
		//下面n1,n2的赋值是给下一级台阶准备的。
		n1 = n2;			//下一级台阶的前2级可能的跳法和这一级的前1级可能的跳法相等
		n2 = total;			//下一级台阶的前1级可能的跳法和这一级台阶的可能跳法相等
	}
	return total;	//返回跳法总和。
}

        这种算法,满足题目要求的时间复杂度和空间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值