一.题目描述
JZ9 跳台阶扩展问题
题目链接:https://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&&tqId=11162&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
注意审题:该题青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.
二.算法1(找规律)
图片说明
可发现 1,2,4,8,16,32(n=1,2,3,4,5,6)即2^(n-1).找到规律可以求出n阶台阶的方案数了.

class Solution {
public:
    int jumpFloorII(int number) {
        long long a=2,b=number-1,c=1;
        while(b){//用的快速幂求2^(n-1)速度更加快
            if(b%2) c*=a;
            a*=a;
            b/=2;
        }
        return c;
    }
};

复杂度:o(logn)
优缺点:实现比较方便,但是规律不容易发现要至少例举到5才可以发现规律
三.算法2(递归)
图片说明
图片说明
两式相减得:图片说明
得到上述关系式子直接上代码:

class Solution {
public:
    int jumpFloorII(int number) {
        if(number<= 0)
            return -1;
        else if(number==1)
            return 1;
        else{
            return 2*jumpFloorII(number-1);
        }
    }
};

复杂度:o(n)
优缺点:实现比较简单,但是利用函数进行推导不容易想到.