zoukankan      html  css  js  c++  java
  • 剑指 Offer 10- I. 斐波那契数列

     一道最最基础的题目,但我想借这个题目比较一下动态规划和递归

    class Solution {
        public int fib(int n) {
            int[] dp=new int[n+1];//从0到n
            if(n==0)
            {return 0;}
            else if(n==1)
            {return 1;}//数组越界问题
            dp[0]=0;
            dp[1]=1;
            for(int i=2;i<n+1;i++)
            {
                dp[i]=(dp[i-1]+dp[i-2])% 1000000007;
            }
            return dp[n];
    
    
        }
    }

    注意数组越界问题

    递归法所产生的重复计算:

    动态规划法时间复杂度On,空间复杂度还可以相应的简化为o1

    很多能描述递归流程的问题都可以用动态规划解决。但动态规划也有一定的局限性。

    动态规划的实质是记忆(这很重要,但网络上的绝大多数资料都没有关注这一点)。
    所以,它需要问题满足两个性质

    • 可以记忆,这就是无后效性
    • 需要记忆,即记了以后有好处,这就是重叠子问题


    而由这两个要求就能确定问题是否可以使用动态规划

    1. 解决后效性的主要方法是增加记忆数组维数,但相应带来的问题是存储空间不够(尽管通过覆盖数据等措施,仍可以用 DP 解决,但这样做会很麻烦,并且这也要求找出子问题之间的逻辑关系,即将动规写成递推形式)
    2. 更常见的情况是,问题没有或几乎没有重叠子问题,这样就不需要使用动态规划了。因为即使记忆了,这些数据也没有用武之地
  • 相关阅读:
    招行面试
    今日头条面试[教育岗]
    四方精创 面试
    ArrayList 源码
    redis缓存,穿透,击穿,雪崩
    hashMap
    集合整理
    阿里CBU技术部一面
    网安面试
    php递归获取顶级父类id
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14447877.html
Copyright © 2011-2022 走看看