题目描述
一只青蛙一次可以跳上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
}