当前位置: 首页 > Web前端 > JavaScript

图形算法-LeetCode第70题爬楼梯的问题

时间:2023-03-27 17:02:37 JavaScript

最近开始苦读算法,遇到这个很有意思的题目,因为从中复习了斐波那契数列,通过某资料,找到了中科院官网,阅读很多科普文章。深入挖掘,你会看到很多东西。本着热爱分享的初衷,我整理了这篇文章,分享给大家。题目本身并不难。欢迎相互交流。感谢您的帮助。转到主题。本题为LeetCode第70题ClimbingStairs,题目如下:假设你正在爬楼梯。需要走n步才能到达建筑物的顶部。您一次可以爬1或2个台阶。您可以通过多少种不同的方式到达建筑物的顶部?你可以先考虑一下。流程分析这道题可以每次走一级,也可以一次走两级,所以我们会有3种走法:全程任意走,比如全1级;前面随机走,最后一步只走1级;前面任意走,最后一步只走2级;为了大家理解,我画了几张图,如下:第一种走路方式就不详细介绍了。第二种移动方法,倒数第二步的方法如下,有1步和2步两种方式;第三种移动方法,倒数第二步的方法如下,也有1步和2步两种方式:上面的过程描述了从最后一层开始每一层的移动。最后一步有1步和2步两种方式,可以理解为只有1步或者2步才能到达最后一层。当最后一步为1步时,从第n-1层开始;当最后一步为2步时,从第n-2层开始;再理解一下这个过程,就是第n层的走棋次数是n-th1层和n-2层走棋次数的总和。如果还是不明白,可以再看看之前的图。归纳法分析当然,事情没有解决,归纳法就开始了。我们可以列出几种情况进行分析:步数,步数,步数,1112211,233111,12,21451111,112,121,211,225811111,1112,1121,1211,2111,221,212,122...可以发现一个简单的规律,当步数为n层时,它的步数为n-1层的步数加上n-2层的步数。记为:f(n)=f(n-1)+f(n-2)。1楼有1个固定动作;二楼2个固定动作;……5层的走法数等于4层的走法数加5层。了解了整个过程的规律之后,我们的代码就简单多了:方案一:循环累加计算通过简单的循环累加即可得到结果:constclimbStairs=(n=1)=>{if(n<=2)return名词;让res=0,n1=1,n2=2;//n1表示前2项,n2表示前1项for(leti=3;i<=n;i++){//前两项的值固定,所以从第3项res开始循环=n1+n2;n1=n2;n2=资源;}returnres;}测试6楼的步数:climbStairs(6);//13方案二:递归根据f(n)=f(n-1)+f(n-2)计算,这个方法比较简单:constclimbStairs=(n=1)=>{if(n<=2)返回n;returnclimbStairs(n-1)+climbStairs(n-2);}测试6楼的步数:climbStairs(6);//13这种方法比较简单易懂,但是递归比较耗时,LeetCode容易超时提示。方案三:利用数组的特性利用f(n)=f(n-1)+f(n-2)的规律,先预设前2项,然后开始循环,最后返回最后一项数组的项目:constclimbStairs=n=>{letresult=[1,2];对于(让i=2;i{leta=b=1;for(leti=0;i{if(n<=2)returnn;如果(n==3)返回4;returnclimbStairs(n-1)+climbStairs(n-2)+climbStairs(n-3);}被测第6层的走步数:climbStairs(6);//24拓展知识:斐波那契数列这道题主要考查类似斐波那契数列(Fibonaccisequence)计算的内容,如果你还不知道什么是斐波那契数列,这里先简单介绍一下,同时推荐一下李永乐老师讲解的斐波那契数列。它最早是由数学家莱昂纳多·斐波那契(LeonardoFibonacci)以养兔为例提出的。顺序大致是这样的:0,1,1,2,3,5,8,13,21,34....仔细观察,我们可以发现一个规律:从第三项开始,每一项的价值都等于前两项的总和。在自然界中,斐波那契数列的排列方式有很多,比如一棵普通的树,它的树枝长成这样:(图片来源网络)可以看到每一层的树枝数是1,2,3,5,8,。..为了。当然还有很多:(自然界中各种斐波那契螺旋线,图片来自网络)根据斐波那契数列的规律,我们可以得到公式f(n)=f(n-1)+f(n-2)。类似于我们之前列出的。总结这道题本身不难,但如果不弄清楚流程和规律,就很容易掉入陷阱,写出多余的代码。本文只列举了4种简单的实现方法。如果大家还有其他的实现方法,欢迎一起讨论,哈哈。