题目一
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共需要多少种跳法
方法一,用递归
思路
如果只有一级台阶, 一种跳法
如果两级台阶,两种跳法,① 每次跳一级 ② 一次跳两级
如果三级台阶,三种跳法 ① 每次跳一级,跳三次 ② 一次跳两级,一次跳一级 ③ 一次跳一级,一次跳两级
如果是四级台阶, 5种跳法 ① 每次跳一级,跳4次 ,② 两次跳两级 ③每次跳一级,跳两次,一次跳两级,跳一次
④ 一次跳一级,一次跳两级,一次跳一级
.....
台阶 | 跳法 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
6 | 13 |
… | … |
根据上面的表格可以看出前两项的和加起来等于后一项,类似于斐波那契数列,n阶台阶时的跳法看成n的函数f(n),f(n)=f(n-1)+f(n-2)
public class Test {
static int f(int n) {
if(n < 2) {
return 1;
}
return f(n-1)+f(n-2);
}
public static void main(String[] args) {
int n=4;
int result =f(n);
System.out.println(result);
}
}
递归的方法在输入较大的数如 100 ,程序会非常的慢,时间效率低
方法二 迭代
f[3] = f[2] + f[1]
f[4] = f[3] + f[2]
....
每次只需要知道他的 n-1项 和 n - 2 项
public int JumpFloor(int target) {
if(target <= 0){return 1;}
if(target == 1 || target ==2){
return target;
}
int a1 = 1;
int a2 = 2;
int temp =0;//定义中间变量
for(int i =3; i<= target;i++){
temp = a1+a2;
a1 = a2;
a2 = temp;
}
return temp;
}
题目二
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
示例1
输入
3
返回值
4
思路:
f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(1)
f(n-1)=f(n-2)++f(n-3)+...+f(1)
两个表达式相减
f(n)=2 * f(n-1)
且 f(1) = 1
f(n) = pow(2, n - 1)
public class Solution {
public int JumpFloorII(int target) {
return (int)Math.pow(2,target -1);
}
}