《9.变态跳台阶》

126 阅读1分钟

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:

设跳上n级的台阶有f(n)种方法。假设现在已经跳到了第n级,我们关注跳到第n级的前一步在哪,也就是从哪里起跳到第n级的。可能是从第n-1级跳到第n级,那么跳到第n-1级有f(n-1)种方法;也可能是从第n-2级跳到第n级,跳到第n-2级有f(n-2)种方法.以此类推,如果是从第一级跳一步到第n级,跳到第一级有f(1)种方法。第0级也可以直接跳到第n级,跳到第0级有f(0)种方法。

所以跳到第n级的方法总数,就是这些的和。

f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)

初始条件f(0)=f(1)=1

方法一:

根据f(0),f(1),求出f(2),再是f(3)...

时间复杂度O(n^2),空间复杂度O(n)

function jumpFloorII(number)
{    
    if(number===0 || number===1){
        return 1
    }
    let result=[1,1]
    for(let i=2;i<number+1;i++){
        result[i]=0
        for(let j=0;j<i;j++){
            result[i]+=result[j]
        }
    }
    return result[number]
}

方法二:

根据数学推导

f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)
f(n-1)=f(n-2)+...+f(1)+f(0)

两式相减,得到f(n)=2*f(n-1) 初始条件还是f(0)=f(1)=1

时间复杂度O(n),空间复杂度O(1)

function jumpFloorII(number)
{    
    if(number===0 || number===1){return 1}
    let old=1
    let newValue=1
    for(let i=2;i<number+1;i++){
        newValue=old*2
        old=newValue
    }
    return newValue
}