题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路一
自己参考之前的迭代方法
f(n) = f(n-1)+f(n-2)+…+f(1)+f(0);
写出来的代码为
public class Solution {
public int JumpFloorII(int target) {
int total =0;
if(target<=1){
return 1;
}else{
for(int i =1; i<= target;i++){
total = JumpFloorII(target-i) + total;
}
return total;
}
}
}
虽然能通过,但是时间复杂度很高O(n^2)
思路二
对于方法一中的:f[n] = f[n-1] + f[n-2] + … + f[0]
那么f[n-1] 为多少呢?
f[n-1] = f[n-2] + f[n-3] + … + f[0]
所以一合并,f[n] = 2*f[n-1],初始条件f[0] = f[1] = 1
所以可以采用递归,记忆化递归,动态规划,递推。具体详细过程,可查看青蛙跳台阶。
这里直接贴出递推的代码。
public class Solution {
public int JumpFloorII(int target) {
int total =1;
if(target<=1){
return 1;
}else{
for(int i =2; i<= target;i++){
total = total*2;
}
return total;
}
}
}
思路三
当然,你会发现一个规律:
f[0] = f[1] = 1
f[2] = 2 = 2^1
f[3] = 4 = 2^2
f[4] = 8 = 2^3
…
f[n] = 2^n-1
所以,针对本题还可以写出更加简单的代码。
return Math.pow(2, n-1);
本文探讨了青蛙跳上n级台阶的不同解决策略,从递归迭代到动态规划,对比了三种方法的时间复杂度,并重点介绍了利用递推公式f[n]=2^n-1简化问题,以降低至O(n)的高效解决方案。

被折叠的 条评论
为什么被折叠?



