描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
从跳台阶问题就可以推出啊,
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
f(0) = 1;
f(1) = 1;
f(2) = f(2-1) + f(2-2); //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3);
...
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n);
说明:
1)这里的f(n) 代表的是n个台阶有1,2,...n阶的跳法。
2) 由以上可知:
f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1);
故f(n-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2);
所以 f(n) = f(n-1) + f(n-1) = 2 * f(n-1);
3) 可以知道有n阶台阶,有1、2、...n阶的跳的方式时,总共跳法为:
| 1 ,(n=0 )
f(n) = | 1 ,(n=1 )
1 class Solution { 2 public: 3 int jumpFloorII(int number) { 4 if(number < 2) 5 return number; 6 int first = 1; 7 for(int i = 2; i <= number; i++) 8 first = 2 * first; 9 return first; 10 } 11 };
当然,乘法不如二进制移位快,这样就可以了:
1 class Solution { 2 public: 3 int jumpFloorII(int number) { 4 return 1 << --number; 5 } 6 };