2019独角兽企业重金招聘Python工程师标准>>>
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
相比普通青蛙跳,这个 n级的就有点难了,重点是 能跳n级, 也就是说,只有当台阶数是1的时候,是1种跳法。
别说2阶是两种。。。
3阶 还 4种, 4 阶还 8种。 。。 。明显抬杠。。。。。。。穷举法做的吧?
因此只有将台阶 无限的化少,化少,直至 1阶,这样才能找到问题的解决办法。
那就要倒着想,如果多了一阶台阶,方法是多了多少呢?
因为我只知道 如果多 了一阶,别 之前的 跳法多了多少,不就能求出了当前台阶的跳法了吗。
数学思路:
当前台阶数的跳法,其实是 台阶数的所有 子集 台阶数的跳法(每个子集台阶,然后在直接一下跳到最后一阶)。
例如 5阶跳法,其实就是1阶的所有跳法+2阶的所有跳法+3阶的所有跳法+4阶的所有跳法+1(直接跳5阶)。
累加的话就需要写一个 循环,将 n阶 一下一下减,直到1 ,然后将所有台阶跳法 求和,实现起来也不是很难,再写一个静态 sum 就好, 记录 总和
不过这样就会 循环 调用递归, 递归本身,再次循环,势必数据一多,就是 挂掉。
其他想法:
展现我灵魂画手的实力:
假设当前有 n(示意为4) 阶,跳法有x种。
然后 加了 一阶 变为 n+1
当台阶是加在4层上面的时候:
青蛙使用 了 x种方法 每种方法都能跳到 n阶上, 然后使用跳1 下的方法,跳上n+1阶。
当台阶是加在1层下面,也就是让青蛙下一个台阶,总台阶还是 n+1 往上跳。 那么 开始跳1 ,然后剩余的 n阶 还是 x种跳法。
至于台阶加在其他处,不过是将n阶 “挤” 成了第5阶,实质还是加了最后1阶。
一次 n阶方法的跳法 就是 2*(n-1) 阶的跳法。
代码:
public static int JumpFloorII(int target) {if(target==0){return 0;}if(target==1){return 1;}return JumpFloorII(--target)*2;}
错误的想法:
在我想如何组织语言,让你们接受 台阶加在 最顶层,还是最下层的时候,我差生了一个错误的想法,
既然是 第一步跳1, 那么 我其实可以将 这多的1步,放在任何位置啊。
其实这是错误的想法, 这里面有严重的跳法重叠 。
比如说我 跳5阶前 加了一步, 跳到了 第6阶上。然后直接 跳最后一阶。
跟
跳6阶的 跳法 中,然后直接跳到最后一阶 是重复的 跳法。
第一种是 5阶跳法 中间多跳1阶,然后跳最后。
第二种是原本的6阶跳法,直接跳 最后。
因此,这种思维是错误的。
我的想法:
感觉这个题目形容起来不是很清晰,看的话估计也不是很明白,这个题目给我的感觉就是,多一阶台阶后,其实中间台阶怎么跳法不介意,第一步只能多在 n-1阶跳法的 最前面,跟最后面, 也就是 2*(n-1)阶跳法。
无论怎么加在中间,肯定是 有重复的跳法。