题目链接
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
若 n = 1,有1中可能
若 n = 2
- 第一次跳 1 级:剩下1级,有 1 种可能
- 第一次跳 1 级:直接到达,有 1 种可能
共 2 种。
若 n = 3
- 第一次跳 1 级:剩下2级,有 f(2) 种可能
- 第一次跳 2 级:剩下1级,有 f(1) 种可能
- 第一次跳 3 级:直接到达,有 1 种可能
共 f(2) + f(1) + 1种
若 n = 4
- 第一次跳 1 级:剩下3级,有 f(3) 种可能
- 第一次跳 2 级:剩下2级,有 f(2) 种可能
- 第一次跳 3 级:剩下1级,有 f(1) 种可能
- 第一次跳 4 级:直接到达,有 1 种可能
共 f(3) + f(2) + f(1) + 1 种。
我们可以推出,
f(n) = f(n-1) + f(n-2) + … + f(1) + 1
f(n-1) = f(n-2) + … + f(1) + 1
上下相减得到 f(n) = 2 * f(n-1);
又等比数列 可以 得到 f(n) = 2 ^ (n-1)
递归法
public class Solution {
public int JumpFloorII(int target) {
if (target == 1)
return 1;
return 2 * JumpFloorII(target - 1);
}
}
递推法
public class Solution {
public int JumpFloorII(int target) {
if (target <= 2)
return target;
int[] f = new int[target + 1];
f[1] = 1;
f[2] = 2;
for (int i = 3; i <= target; i++) {
f[i] = 2 * f[i-1];
}
return f[target];
}
}
公式法
直接求 2 ^ (n-1)
public class Solution {
public int JumpFloorII(int target) {
int ret = 1;
for (int i = 2; i <= target; i++) {
ret *= 2;
}
return ret;
}
}
快速幂
public class Solution {
public int JumpFloorII(int target) {
return quick_pow(2, target - 1);
}
private int quick_pow(int a, int b) {
int ret = 1;
while (b > 0) {
if ((b & 1) == 1) {
ret *= a;
}
a *= a;
b >>= 1;
}
return ret;
}
}