一、题目
二、题目分析
1.首先我们考虑最简单的情况,如果只有1级台阶,那显示只有一种跳法。如果有2级台阶,那么就两种跳法:一种是分两次跳,每次跳一级,另一种就是一次跳两级
2.接着我们讨论最普通的情况,假设要上n层(n>2),第一种情况,第一次只跳一级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);第二种情况,第一次只跳两级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)
3.综上所述:f(n)=f(n-1)+f(n-2)满足斐波那契数列。
三、代码
/** * @param {number} n * @return {number} */ var numWays = function(n) { if(n==0||n==1) return 1; let a=1,b=1,sum=0; for(let i=0; i<n;i++){ sum=(a+b)%1000000007; a=b; b=sum; } return a; };
四、其他解法
动态规划:每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的
/** * @param {number} n * @return {number} */ var numWays = function(n) { const dp = new Array(); dp[0]=1; dp[1]=1; dp[2]=2; for(let i =3; i<=n;i++){ dp[i] = (dp[i-1] + dp[i-2])%1000000007; } return dp[n]; };
1.arr=new Array() 和 arr=[]都是定义一个数组,前者是定义一个调用数组构造函数生成的数组,后者定义一个字面量定义数组的方法;两者没有太大区别。
五、理解
1.第一种解法和第二种解法的区别
答:第一种解法:计算一个数只会用到前面两个数的值再相加,所以不用数组保存,直接换成临时数保存;
第二种解法:填充的顺序是由小到大填充,略过递归计算填充带来的性能消耗
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理