剑指offer_编程题——跳台阶和变态跳台阶

跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
假设我们现在在第n阶阶梯上,显然,我们上一步是在n-1阶或者n-2阶,我们可以知道,第n阶的方法=n-1阶的方法+n-2阶的方法
同样的,对于n-1阶和n-2阶我们也可以用类似的方法进行求解。
而当我们求到0阶和1阶的时候,显然方法种数分别为1、1。
所以如果f[i]表示爬到第i阶的方法数,那么
f[0]=1 f[1] = 1;
f[i] = f[i - 1]+ f[i - 2] ;

class Solution {
public:
    int jumpFloor(int number) {
        int ret=0;
        if(number==0||number==1)
            ret=1;
        else
        {
            int prev=1;
            int pprev=1;
            while(number>1)
            {
                ret=prev+pprev;
                pprev=prev;
                prev=ret;
                number--;
            }   
        }
        return ret;
        //if(number==0||number==1)
          //  return 1;
       // return jumpFloor(number-1)+jumpFloor(number-2);
    }
};

变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
由题意知:跳n阶台阶:一步可以跳1级,跳2级,跳3级直至跳n级。
如果一步跳1级:剩下n-1级,则剩下跳法是f(n-1)种;
如果一步跳2级:剩下n-2级,则剩下跳法是f(n-2)种;
f(n)=f(n-1)+f(n-2)+f(n-3)+…f(1)+f(0);
f(n-1)=f(n-2)+f(n-3)+f(n-4)+…+f(1)+f(0);
那么f(n)=2*f(n-1);
用递归代码如下:

int jumpFloor1(int n)
{
	int result = 0;
	if (n == 0 || n == 1)
	{
		return 1 ;
	}
	int num = n;
	while (num--)
	{
		result = result+ jumpFloor1(n - 1);
		n--;
		
	}
	return result;
}

用递推代码如下:

int jumpFloor2(int n)
{
	int ret = 1;
	if (n == 0 || n == 1)
		return ret;
	for (int i = 2; i <= n; i++)
	{
		ret = ret * 2;
	}
	return ret;
}

第0阶台阶有一种跳法,第1阶台阶有一种跳法,第2阶台阶有2 (21)种跳法,第3阶台阶有4(22)种跳法,第4阶台阶有8(23)种跳法…那么可以退出f(n)=2(n-1)种跳法,即f(n)=pow(2,n-1),代码如下:

int jumpFloorII(int number) {
        if(number==0||number==1)
        {
            return 1;
        }
        return (int)pow(2,number-1);

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/82745449