《剑指offer》——变态跳台阶

来源:互联网 发布:长歌门捏脸数据 编辑:程序博客网 时间:2024/05/01 04:07

这是《跳台阶》题目的升级版,不止是每步都是1或者2,而是可以从1调到n,求其跳法。

T:

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

constraints:

时间限制:1秒空间限制:32768K

这一题目,虽然只是略微的修改了条件,但其解题方式完全不同。
同时,“青蛙跳台阶”只是一种具体的场景设定,抽象来看,其可看做如下表述:

抽象:
对于一个正整数n,可以按照如下方式表达:

n=1+1++1n1

n=1+2+1++3+

即:凡是小于n的正整数可以作为一个加数因子,问总共有多少种此类的表达式?


在我的理解当中,此种类型有2种方式:

隔板法

这里写图片描述

共有n个球,代表n个台阶,在这里设定每个球的数量值为1。n个球有n-1个空隙。

  • 如果插入1个隔板,那就代表只需要2步就可以到达n阶的台阶,类似上图中给出的例子。
  • 在插入1个隔板的情况下,如果插入的位置不同,则代表第一步的步长不同,即第一步跳的台阶数不同,也代表了不同的跳台阶方案,所以,可以应用隔板情况下的组合数进行求解。
  • 比如插入了k个隔板,那么就有n1k种跳跃方式。

因此,可以得到如下结果:

n10+n11++n1n1=2n1

公式推导

f(n)表示对于n个台阶情况下的所有跳法,
对于第一步来说,青蛙可以跳1阶,2阶,…,n阶,那么在以上这么多种的情况下,我们可得到如下的递推公式:

这里写图片描述

因此,本题目的实质,就是求一个次幂。

代码:

    public int JumpFloorII(int target) {        int count = 1;        int i = 1;        while (i < target) {            count *= 2;            i ++;        }        return count;    }

还有大神有如下解法:

这里写图片描述

可大致描述如下:

这里写图片描述

0 0
原创粉丝点击