题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题解
- 思路:这是一道可以递归,记忆化递归,动态规划,递推思想的题目。
跳1级:毫无疑问就1种跳法 j1 = 1
跳2级:可以分为 先跳1级剩1级、跳2级两种情况,第一种情况先跳1级剩1级,那么跳法就为跳1级的跳法。 j2 = j1 + 1
跳3级:可以分为 先跳1级2级、先跳2级剩1级、和跳3级三种情况,第一种情况先跳1级剩2级,那么跳法就为跳2级的跳法, 第二种情况先跳2级剩1级,那么跳法就为跳1级的跳法. j3 = j2 + j1 + 1
依此类推 。。。。。。。。。。
跳4级:j4 = j3 + j2 + j1 + 1
跳5级:j5 = j4 + j3 + j2 + j2 + j1
- 公式优化
跳1级:j1 = 1 ------->j1 = 2^0
跳2级:j2 = j1 + 1 -------> j2 = j1 + j1 -------> j2 = 2 * j1 ------->j2 = 2^1
跳3级:j3 = j2 + j1 + 1 ------->j3 = j2 + j2 -------> j3 =2 * j2 ------->j3 = 2^2
跳4级:j4 = j3 + j2 + j1 + 1 -------> j4 = j3 + j3 -------> j4 =2 * j3 ------->j4 = 2^3
跳n级:jn = jn-1 + jn-2 + … + j3 + j2 + j1 + 1 ------->jn = jn-1 + jn-1 ------->jn =2 * jn-1 ------->5 = 2^n-1
- 代码
public static int jumpFloorII(int target) {
int result = 1;
for (int i = 1; i < target; i++) {
result = result << 1;
}
return result;
}
- 结果