青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解法一 :
每一个台阶都有两种选择 : 跳或者不跳
第一个台阶必须跳 , 所以只有 n - 1 个台阶需要选择
那么就是 2^(n - 1)
class Solution {
public:
int jumpFloorII(int number) {
return (int)pow(2, (number-1));
// pow 数学库函数, 乘方
}
};
解法二 :
左移运算相当于乘方运算
1 左移 1 位 , 0000 0001 -––—> 0000 0010 = 2 相当于乘以 2
1 左移 2 位 , 0000 0001 -––—> 0000 0100 = 4 相当于乘以 2^2
1 左移 3 位 , 0000 0001 -––—> 0000 1000 = 8 相当于乘以 2^3
..…
所以 2^(n-1) 相当于 1 左移 n-1 位
class Solution {
public:
int jumpFloorII(int number) {
return 1 << (number - 1);
}
};
解法三 :
因为有 n 级台阶 , 每次有 n 种跳法 : 跳 1 级 , 2 级, 3 级 ..… n 级
选择跳 1 级 , 剩下 n - 1 级 , 则剩下每次的跳法为 f(n-1)
选择跳 2 级 , 剩下 n - 2 级 , 则剩下每次的跳法为 f(n-2)
…
选择跳 n 级 , 剩下 n - n 级 , 则剩下每次的跳法为 f(0)
所以
f(n) = f(n-1) + f(n-2) + ... + f(n-(n-1)) + f(n-n)
f(n-1) = f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)
..…
最后得到
f(n) = 2*f(n-1)
class Solution {
public:
int jumpFloorII(int number) {
if(number <= 0)
return -1;
if(number == 1)
return 1;
return 2 * jumpFloorII(number-1);
}
};