一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:
要求:时间复杂度:
,空间复杂度:
/*
如果第一次跳一个台阶,后续的跳法有f(n-1)种
如果第一次跳两个台阶,后续的跳法有f(n-2)种
因此f(n)=f(n-1)+f(n-2)
另外,
当n=1时,f(1)=1
当n=2时,f(2)=2
*/
//暴力递归
const jump01 = (n) => {
let result = 0
if(n === 0){
result = 1
}else if(n <= 2){
result = n
}else if(n > 2){
result = jump01(n-1) + jump01(n-2)
}
return result
}
//把计算过的情况存入map,减少计算量
function jump02(n){
let map = new Map()
if(n === 0){
map.set(n,1)
}else if(n <= 2){
map.set(n,n)
}
if(map.has(n)){
return map.get(n)
}else{
map.set(n,jump01(n-1) + jump01(n-2))
return map.get(n)
}
}
//动态规划
function jump03(n){
if(n === 0){
return 1
}else if(n <= 2){
return n
}
let a = 1,b = 2,temp = 0
for(let i = 3;i <= n;i++){
temp = a + b
a = b
b = temp
}
return temp
} function jumpFloor(number)
{
// write code here
let count=0
function jump(n){
if(n==number) return count++
if(n<number){
jump(n+1)
jump(n+2)
}
}
jump(0)
return count
} function jumpFloor(number)
{
// write code here
// 本题比较特殊可以将动态规划的数组优化为两个变量, 但是此处仍采用基础的动态规范方法
// 1. 确定dp数组意义, 并进行初始条件赋值
const dp = [1, 2]
if(number<3) return dp[number-1]
// 2. 确定元素之间的关系, 由题知: dp[i] = dp[i-1] + dp[i-2]
let cur = 2
// 3. 遍历求值
while(cur<number){
dp[cur] = dp[cur-1] + dp[cur-2]
cur++
}
return dp[number-1]
}
module.exports = {
jumpFloor : jumpFloor
};
function jumpFloor(number)
{
let result =0;
let drawback =function(n){
if(n==0) { result++; return ;}
else if(n<0){return ;}
for(let i=0;i<2;i++){
n= n-(i+1);
drawback(n);
n = n+(i+1);
}
}
drawback(number);
return result;
} 2、自上而下,n步台阶的解法=n-1解法+n-2解法 function jumpFloor(number)
{
let result =0;
let dp1 = 1,dp2 = 2;
if(number>2){
for(let i=3;i<=number;i++){
result = dp1+dp2;
dp1 = dp2;
dp2 = result;
}
return result
}else{
return number;
}
} function jumpFloor(number)
{
// write code here
// 基础的类似斐波那契
// if(number === 1) return 1;
// if(number === 2) return 2;
// return jumpFloor(number-1) + jumpFloor(number-2);
// 动态规划
let g = 1,
f = 2;
if(number === 1) return g;
if(number === 2) return f;
for(; number > 1; number--) {
f += g;
g = f - g;
}
return g;
}
module.exports = {
jumpFloor : jumpFloor
}; //动态规划
function jumpFloor(number)
{
// write code here
let dp = new Array(number+1).fill(0);
dp[0]=dp[1]=1;
for(let i=2;i<=number;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[number];
}
//递归
function jumpFloor(number)
{
// write code here
if(number<=1)return 1;
return jumpFloor[number-1]+jumpFloor[number-2];
} const map = new Map();
function jumpFloor(number)
{
if(number > 1){
let result = map.get(number);
if (result) {
return result;
}
result = jumpFloor(number - 1) + jumpFloor(number - 2)
map.set(number, result);
return result
} else {
return 1;
}
}
module.exports = {
jumpFloor : jumpFloor
}; javascript版:
function jumpFloor(number)
{
if (number <= 1) return number;
let a = 1, b = 1;
for (let i = 2; i <= number; i++) {
b = a + b;
a = b - a;
}
return b;
}python版:
class Solution:
def jumpFloor(self, number):
if number <= 1:
return number;
a = b = 1
for _ in range(2, number + 1):
a, b = b, a + b
return b
function jumpFloor(number)
{
// write code here
let meth = [1, 2, 3];
for(let i = 3; i < number; i++) {
meth.push(meth[i-2] + meth[i-1])
}
return meth[number - 1]
} function jumpFloor(number)
{
const fn = (n,temp1 =1,temp2=1) => {
if(n <= 1) return temp2
return fn(n-1, temp2,(temp1 + temp2))
}
return fn(number)
// write code here
} 动态规划 function jumpFloor(number)
{
// write code here
const dp = new Array(number+1).fill(0)
dp[0] = 1
dp[1] = 1
for(let i = 2; i < dp.length;i++){
dp[i] = dp[i-1] + dp[i-2]
}
return dp[number]
} function jumpFloor(number)
{
//一只青蛙一次可以跳上1级台阶,也可以跳上2级。
//求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
//对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以F(n) = F(n-1) + F(n-2)
if (number <= 0) return 0;
else if (number == 1) return 1;
else if (number == 2) return 2;
else return jumpFloor(number-1) + jumpFloor(number-2)
}
module.exports = {
jumpFloor : jumpFloor
};
对于本题,前提只有 一次 1阶或者2阶的跳法。
a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列:
| 1, (n=1)
f(n) = | 2, (n=2)
public class Solution { public int jumpFloor(int target) { if (target <= 0) { return -1; } else if (target == 1) { return 1; } else if (target ==2) { return 2; } else { return jumpFloor(target-1)+jumpFloor(target-2); } } }