一、跳台阶
1.题目描述
2、大致思路
3、代码实现
public int jumpFloor(int n){
if(n <= 2){
return n;
}
int pre2 = 1, pre1 = 2;
int result = 1;
for (int i = 2; i < n; i++) {
result = pre2 + pre1;
pre2 = pre1;
pre1 = result;
}
return result;
}
二、 变态跳台阶
1.题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
2.大致思路
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);
3.实现代码
链接:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387?answerType=1&f=discussion
来源:牛客网
public class Solution {
public int JumpFloorII(int target) {
if(target <= 2){
return target;
}
int[] dp = new int[target + 1]; // 0 号不使用
dp[1] = 1; //跟普通的 pre2 一个意思
dp[2] = 2; //跟普通的 pre1 一个意思
for (int i = 3; i <= target; i++){
for (int j = i - 1; j >= 1; j--){
dp[i] += dp[j];
}
dp[i]++; // 每一项都+1
}
return dp[target];
}
}
a.递归实现:
int jumpFloorII(int number)
{
if(number<1)
return 0;
if(number==1)
return 1;
else
return 2*jumpFloorII(number-1);
}
b.数学实现:
c.动态规划方法 自底向上
public static int JumpFloor(int level){
if(level ==0){
return 0;
}
int arr[] = new int[level + 2];
arr[0] = 1;arr[1] = 1;arr[2] = 2;
if(level < 3 && level > 0){
return arr[level];
}
for (int i = 3; i <= level ; i++) {
arr[i] = 2 * arr[i - 1];
}
return arr[level];
}