二行代码搞定变态跳台阶
变态跳台阶
http://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387
当遇到求解有多少种类型的数字相加等于n的问题时,如一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
可以先从低层台阶找到规律:
1层台阶:1种
2层台阶:2种
3层台阶:4种
4层台阶:8种
......
我们发现每增加一层台阶,其中当层的跳法是上一层的2倍
则有f(n) = 2f(n-1)
如果不采用推断规律的方法,我们也可以考虑采用数学的方法推断:
f(n)=f(n-1)+f(n-2)+……f(1)
f(n-1)=f(n-2)+……f(1)
两式相减则有: f(n)=2f(n-1)
这个式子如果不好理解,我们可以采用普通跳台阶的题目进行回答:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
那么想跳到 n 层的台阶的时候,必然是已经跳到了 n-1 层 或者 n-2 层,此时只要再进行一步就能跳到 n 层
那么则有f(n) = f(n-1) + f(n-2)
同理对于不限制跳台阶,则有f(n)=f(n-1)+f(n-2)+……f(1),此时需要一些数学功底的变换,才能获得上述结论。
下面给出代码:
public class Solution { public int JumpFloorII(int target) { if(target == 0 || target == 1){return target;} return 2 * JumpFloorII(target - 1 ); } }