一只青蛙一次可以跳上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)