• 【递归】青蛙跳台阶问题


    题目描述:

    思路一:递归

    此类求多少种可能性的题目一般都有递推性质 ,即 f(n) 和 f(n1)…f(1) 之间是有联系的

    f(0)=1 

    f(1)=1 

    f(2)=2 

    f(3)=3

    f(4)=5

    ....

    以上类似斐波那契数列,不同的是斐波那契数列f(0)=0

    1 class Solution {
    2 public:
    3     int numWays(int n) {
    4         if(n==0||n==1)
    5             return 1;
    6         return numWays(n-1)+numWays(n-2);
    7     }
    8 };

    时间复杂度O(2n

    空间复杂度O(n)

    思路二:动态规划

    动态规划解析:

    状态定义: 设 dpdp 为一维数组,其中 dp[i]dp[i] 的值代表 斐波那契数列第 $i$ 个数字 。
    转移方程: dp[i + 1] = dp[i] + dp[i - 1]dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n + 1) = f(n) + f(n - 1)f(n+1)=f(n)+f(n−1) ;
    初始状态: dp[0] = 1dp[0]=1, dp[1] = 1dp[1]=1 ,即初始化前两个数字;
    返回值: dp[n]dp[n] ,即斐波那契数列的第 nn 个数字。

    解析链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/solution/mian-shi-ti-10-ii-qing-wa-tiao-tai-jie-wen-ti-dong/

    注意不需要判断n=0和n=1的情况,如果判断会大大增加runtime。

     1 class Solution {
     2 public:
     3     int numWays(int n) {
     4         vector<int> v(n + 1, 1); 
     5         for(int i = 2; i <= n; i++)
     6             v[i] = (v[i - 1] + v[i - 2]) % 1000000007;
     7         return v[n];//直接返回最后一个数
     8 
     9     }
    10 };

    时间复杂度O(n)

    空间复杂度O(n)

    思路三:斐波那契

     1 class Solution {
     2 public:
     3     int numWays(int n) {
     4         if(n==0||n==1)
     5             return 1;
     6         int s1=1,s2=1,s3;
     7         for(int i=2;i<=n;i++){
     8             s3=(s1+s2)%1000000007;
     9             s1=s2;
    10             s2=s3;
    11         }
    12         return s3;;
    13     }
    14 };

    时间复杂度O(n)

    空间复杂度O(1)

    其中关于1000000007的问题可见  https://www.liuchuo.net/archives/645

  • 相关阅读:
    mysql导入数据到oracle中
    CAS代理配置
    CAS登录时不仅仅需要用户名来确认身份的情况
    easyui datalist按组多选
    easyui tree loadFilter的使用
    sketchup
    Spring Autowired 注入失败总是Null
    table sorting–angularjs
    mac系统下mysql开机启动总是3307
    angularjs 实现 文件拖拽,缩略图显示
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12776158.html
Copyright © 2020-2023  润新知