【手把手带你刷好题】—— 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天!

加油吧少年。

 


相关文章
|
前端开发 应用服务中间件 nginx
Next.js 创建项目到服务器部署(目录结构介绍、项目结构Demo、开发细节注意)
Next.js 创建项目到服务器部署(目录结构介绍、项目结构Demo、开发细节注意)
1633 0
|
10月前
|
机器学习/深度学习 人工智能 云计算
2025年2月阿里云服务器价格与选购指南
随着云计算技术的普及,阿里云在2025年推出了多款高性价比的云服务器产品。本文基于《2025年阿里云服务器收费价格表》,从配置选择、适用场景到优惠活动,为您提供全面的购买参考。涵盖入门级轻量应用服务器、经济型e实例、企业级通用算力型u1实例、高性能服务器及GPU服务器等,适合个人开发者到大型企业的不同需求。详细对比各类配置的价格与性能,并提供抢购秒杀、续费优惠及代金券组合使用等省钱策略,助您降低上云成本。立即访问云小站活动页面领取最新折扣,开启高效云端之旅!
|
存储 Kubernetes 算法框架/工具
Kubevirt
Kubevirt
611 12
|
Ubuntu
百度搜索:蓝易云【Ubuntu系统内核版本降级教程】
重启后,系统将会使用你降级的旧版本内核。请注意,降级内核可能会导致部分硬件或功能不再兼容,因此在降级前请确认旧版本内核的兼容性。
477 0
|
机器学习/深度学习 PyTorch TensorFlow
深度学习模型加速:Pytorch模型转TensorRT模型
深度学习模型加速:Pytorch模型转TensorRT模型
666 0
|
算法
蛮力法解决旅行商问题(穷举查找求最短路径)含解析与代码实现
蛮力法解决旅行商问题(穷举查找求最短路径)含解析与代码实现
729 0
|
存储 编解码 安全
APP测试点总结(全面解析)
客户端功能测试、兼容测试、性能测试、网络测试、接口测试、异常测试、安全测试简介。。。
1132 0
|
芯片 内存技术
平头哥RVB2601测评:web播放器
基于RVB2601开发一个Web播放器
1178 0
平头哥RVB2601测评:web播放器
|
网络协议 监控
HttpClient连接池的连接保持、超时和失效机制
HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能。每次HTTP请求结束的时候,HttpClient会判断连接是否可以保持,如果可以则交给连接管理器进行管理以备下次重用,否则直接关闭连接。
4310 1