zoukankan      html  css  js  c++  java
  • 青蛙跳台阶问题

    青蛙跳台阶问题

    题目地址https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/

    题目的大概含义是,青蛙要跳到第n个台阶,每次只能跳一个台阶,或者两个台阶,问小青蛙总共有几种不同的跳法,跳到第n个台阶上。
    举例:如果n = 1,那么就只有一种跳法
    如果n=2,那么也只有一种跳法
    如果n=3,那么有三种跳法,分别是:
    第一种,每次一个台阶:1,1,1;
    第二种,先跳一个台阶,后跳两个台阶:1,2;
    第三种,先跳两个台阶,后跳一个台阶:2,1;
    初次拿到这个问题,无从下手,没有丝毫头绪,但是网上总是不乏各种大佬的,下面自己总结下。

    思路分析:

    跳到第n个台阶的前面一个起跳位置可能是第n-1个台阶,也可能是第n-2个台阶。
    假设从第0个台阶跳到第n-1个台阶的所有跳法是f(n-1),到第n-2个台阶的所有跳法是f(n-2)。那么可以推导出从第0个台阶开始到第n个台阶的所有跳法是f(n-1)+f(n-2)。

    在完全理解的得到这个结论之前,我自己还是比较懵逼的。
    我认为得到的f(n)应该等于f(n-1) + f(n-2)再加上2,因为从第n-1跳到n,得跳一个台阶;从n-2跳到n得跳2个台阶,这分别各是一种跳法。那最后不是要加上2吗?
    想了蛮久的,最后终于理解了,为啥不要加2。
    因为你在前面假设从n-1跳到第n个台阶,这种跳法的总数已经确认了,确认为f(n-1)了,最后一步肯定是跳一个台阶。从n-2跳到n也是同理,在0到n-2个台阶跳法f(n-2)已经确认了。后面n-2到n并不是一种跳法,而是纯粹的一下跳2个台阶的动作。
    所以最后可以得出:从第0个台阶跳到第n个台阶的跳法总数等于从第0个台阶跳到第n-1个台阶的跳法总数加上从第0个台阶跳到第n-2个台阶的跳法总数。
    公式表达式:f(n) = f(n-1) + f(n-2)。

    看到公式:f(n) = f(n-1) + f(n-2) ;有接触过斐波那契数列的应该都有印象,这是斐波那契数列的公式。这样我们就可以简单用递归实现,代码如下:

     


    pic-1599023077699.png

     

    引入remMap的原因是,存储中间值,不对相同台阶的步数做两次同样的运算。降低运行时间。
    比如:跳到第7个台阶,需要得到第6和第5台阶的跳法数;跳到第8个台阶需要第7和第6台阶的跳法数。如果不用map存储中间值,那么从第0个台阶跳到第6个台阶的跳法数就需要计算两次。时间上的消耗就大大增加了。这是典型的空间(多引入一种数据结构)换时间(运行时间)的思想。

  • 相关阅读:
    CSPS模拟 57
    CSPS模拟 56
    CSPS Oct目标
    CSPS模拟 55
    CSPS模拟 54
    CSPS模拟 53
    和manacher有关的乱写
    CSPS模拟 52
    CSPS模拟 51
    Git和代码规范
  • 原文地址:https://www.cnblogs.com/xm970829/p/13601151.html
Copyright © 2011-2022 走看看