更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
这是《跳台阶》题目的升级版,不止是每步都是1或者2,而是可以从1调到n,求其跳法。
T:
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
constraints:
时间限制:1秒空间限制:32768K
这一题目,虽然只是略微的修改了条件,但其解题方式完全不同。
同时,“青蛙跳台阶”只是一种具体的场景设定,抽象来看,其可看做如下表述:
抽象:
对于一个正整数
n
n
n,可以按照如下方式表达:
n = 1 + 1 + ⋯ + 1 ( 共 有 n 个 1 ) n = 1 + 1 + \dots + 1 \qquad(共有n个1) n=1+1+⋯+1(共有n个1)
n = 1 + 2 + 1 + ⋯ + 3 + … n = 1 + 2 + 1 + \dots + 3 + \dots n=1+2+1+⋯+3+…
即:凡是小于n的正整数可以作为一个加数因子,问总共有多少种此类的表达式?
在我的理解当中,此种类型有2种方式:
隔板法
共有n个球,代表n个台阶,在这里设定每个球的数量值为1。n个球有n-1个空隙。
- 如果插入1个隔板,那就代表只需要2步就可以到达n阶的台阶,类似上图中给出的例子。
- 在插入1个隔板的情况下,如果插入的位置不同,则代表第一步的步长不同,即第一步跳的台阶数不同,也代表了不同的跳台阶方案,所以,可以应用隔板情况下的组合数进行求解。
- 比如插入了 k k k个隔板,那么就有 ⟮ k n − 1 ⟯ \lgroup_k^{n-1}\rgroup ⟮kn−1⟯种跳跃方式。
因此,可以得到如下结果:
⟮ 0 n − 1 ⟯ + ⟮ 1 n − 1 ⟯ + ⋯ + ⟮ n − 1 n − 1 ⟯ = 2 n − 1 \lgroup_0^{n-1}\rgroup + \lgroup_1^{n-1}\rgroup + \dots + \lgroup_{n-1}^{n-1}\rgroup = 2^{n-1} ⟮0n−1⟯+⟮1n−1⟯+⋯+⟮n−1n−1⟯=2n−1
公式推导
设
f
(
n
)
f(n)
f(n)表示对于
n
n
n个台阶情况下的所有跳法,
对于第一步来说,青蛙可以跳1阶,2阶,…,
n
n
n阶,那么在以上这么多种的情况下,我们可得到如下的递推公式:
因此,本题目的实质,就是求一个次幂。
代码:
public int JumpFloorII(int target) {
int count = 1;
int i = 1;
while (i < target) {
count *= 2;
i ++;
}
return count;
}
还有大神有如下解法:
可大致描述如下:
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~