剑指offer 跳台阶

送分小仙女□ 提交于 2019-12-15 01:36:53

题目介绍:

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

思路:

本题可以有两种思路,一种是通过组合排列来计算跳法总次数,一种是通过斐波那契数列特性来计算。

组合排列法:

本方法有一坑,就是在计算时,的值过大会导致排列组合数值的溢出,此处,通过随算随除的方式将排列组合的计算进行优化。

int jumpFloor(int number) {
        int n2 = number / 2;
        
        int num = 1;
        for(int i = 1; i <= n2; i++){
            int pn = number - i;
            int dived = 1, div = 1;
            for(int j = 1; j <= i; j++){
                div *= (pn - j + 1);
                div = div/j;//排列组合计算优化,随乘随除
            }
            num += (div/dived);
        }
        return num;
    }

算法二:

通过观察从n=1到n=5跳台阶的方法数:1,2,3,5,8。

可发现上述排列符合斐波那契数列的特性,故大胆猜测本题所得序列也一定符合斐波那契数列的特性。故由之写出下面的程序。

int jumpFloor(int number){
        if(number == 1) return 1;
        if(number == 2) return 2;
        int n1 = 1;
        int n2 = 2;
        int n = 0;
        for(int i = 3; i <= number; i++){
            n = (n1 + n2);
            n1 = n2, n2 = n;
        }
        return n;
    }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!