变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
和上一个思路差不多,找规律
台阶数, 跳法
1 1
2 2
3 4
4 8
5 16
得出两个规律
规律一:f(n) = 2*f(n-1)
规律二:f(n) = 2^(n-1)
规律一用于递归写法,规律二用于循环写法
先说递归写法
//思路:找规律f(n) = 2*f(n-1) class Solution { public: // 递归写法,应该会超时 f(n) = 2*f(n-1) int jumpFloorII(int number) { if (number <= 0) return 0; else if(number == 1) return 1; else return 2*jumpFloorII(number-1); } };
再说非递归
//思路:找规律f(n) = 2*f(n-1) class Solution { public: // 非递归写法 f(n) = 2^(n-1) int jumpFloorII(int number) { if(number <= 0) return 0; int times = 1; // pow(2,number-1); for(int i = 1; i < number; i++) times *= 2; return times; } };
还可以换成调用函数的方法 在cmath 中有个函数pow(a, b) 就是a^b a的b次方, 但是左移是最快的
class Solution { public: // 非递归写法 f(n) = 2^(n-1) int jumpFloorII(int number) { if(number <= 0) return 0; return 1<<(number-1); // pow(2, number-1) } };
注意这里 a << b ==>a*2^b 就是a乘以2的b次方
a>>b ==> a/2^b a除以a的b次方