变态跳台阶
知识点:非递归、递归、动态规划
题目:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解析:
target | 跳法 |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 8 |
… | … |
-
- 非递归方式:使用一个数组num 保存每个target的值,num[i] = num[1]+num[2]+…+num[i-1]
-
- 递归方式:和非递归思想相似,只是没有使用数组
-
- 动态规划:
使用f(n)表示跳n级台阶的跳法数量
f(1) = 1 表示跳1级台阶的跳法数量
f(2) = 2 表示跳2级台阶的跳法数量
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)-f(n-1)=f(n-1),即f(n) = 2 * f(n-1)
所以使用动态规划求解
- 动态规划:
代码:
1. 非递归方式
public int JumpFloorII(int target) {
if (target <= 0)
return 0;
if (target == 1)
return 1;
int[] num = new int[target + 1];
num[0] = 1;
num[1] = 1;
for (int i = 2; i < num.length; i++) {
num[i] = 0;
for (int j = 0; j < i; j++) {
num[i] += num[j];
}
}
return num[target];
}
2. 递归方式
public int JumpFloorII(int target) {
if(target==0||target==1)
return 1;
int sum = 0;
for(int i=0;i<target;i++){
sum += JumpFloorII(i);
}
return sum;
}
3. 动态规划
public static int JumpFloorII(int target) {
if (target <= 0)
return 0;
if (target == 1)
return 1;
if (target == 2)
return 2;
int[] num = new int[target + 1];
num[1] = 1;
for (int i = 2; i < target + 1; i++) {
num[i] = 2 * num[i - 1];
}
return num[target];
}