【手把手带你刷好题】—— 52.斐波那契数列(记忆化搜索、简单DP)

简介: .斐波那契数列(记忆化搜索、简单DP)

【前言】

今天是刷题打卡第52天!

今天是成为原创博主的第60天,一转眼马上两个月过去了鸭,坚持似乎也不是特别难的事,加油吧亲们。

 

原题: 斐波那契数列(记忆化搜索、简单DP)

题目链接力扣

题目描述:

示例1:

输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例2:

输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2


方法一:暴力递归

代码执行:

class Solution {
public:
    int fib(int n){
        //方法一:暴力递归
        //找边界
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }
};


上面的代码存在的问题:

出现了大量的重复计算,比如:

 

方法二:循环求解

代码执行:

【敲黑板】:需要注意对于循环体的书写,以及循环条件,可能不是我们想象中那样的平移过程。

class Solution {
public:
    int fib(int n){
        //方法二:循环解决
        int a = 0;
        int b = 1;
        int cur = 0;
        for(int i = 1; i <= n; i++)//当n为0时直接cur = 0
        {
            cur = a + b;
            b = a;
            a = cur;
        }
        return cur;
    }
};


方法三:记忆化搜索(简单DP)

思路:

即然耗时的原因是重复计算,那么我们可以造一个「备忘录」,每次算出某个子问题的答案后别急着返回,先记到「备忘录」里再返回;每次遇到一个子问题先去「备忘录」里查一查,如果发现之前已经解决过这个问题了,直接把答案拿出来用,不要再耗时去计算了。


一般使用一个数组充当这个「备忘录」,当然你也可以使用哈希表(字典),思想都是一样的。


 

class Solution {
public:
    int fib(int n){
        //方法三:记忆化搜索(简单DP)
        //找边界
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        //需要定义一个大小为(n+1)的整形数组,并且初始化为0
        //之所以是n+1,是因为要使用到n这个下标
        vector<int> dp(n+1, 0);
        dp[0] = 0;
        dp[1] = 1;
        for(int i = 2; i < n+1; i++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};


结语

今天是刷题打卡第52天!

加油吧少年。

 


相关文章
【动态规划刷题 1 】 第N个泰波那契数&& 三步问题
【动态规划刷题 1 】 第N个泰波那契数&& 三步问题
|
3月前
|
存储
Leetcode第十五题(三数之和)
LeetCode第十五题“三数之和”要求在一个整数数组中找出所有不重复的三元组,使得它们的和为0,通常通过先排序再使用双指针法来解决。
41 0
Leetcode第十五题(三数之和)
|
8月前
|
算法
六六力扣刷题贪心算法之基础和最大子序和
六六力扣刷题贪心算法之基础和最大子序和
46 0
|
8月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
算法
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
代码随想录Day28 贪心03 LeetCode T1005 K次取反后最大化的数组和 LeetCode T134 加油站 LeetCode T135 分发糖果
38 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
65 0
|
编译器 测试技术 C++
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)(上)
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)
听说三数之和是你梦碎的地方?Leetcode每日刷题(day1)(上)
|
人工智能 算法 程序员
蓝桥杯第十一讲--双指针【例/习题】
蓝桥杯第十一讲--双指针【例/习题】
162 0
蓝桥杯第十一讲--双指针【例/习题】
|
算法 前端开发 程序员
「LeetCode」剑指Offer-10-I 斐波那契数列⚡️
「LeetCode」剑指Offer-10-I 斐波那契数列⚡️
136 0
「LeetCode」剑指Offer-10-I 斐波那契数列⚡️