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

举报
安然无虞 发表于 2022/05/26 23:18:22 2022/05/26
【摘要】 【前言】 今天是刷题打卡第52天! 今天是成为原创博主的第60天,一转眼马上两个月过去了鸭,坚持似乎也不是特别难的事,加油吧亲们。    原题: 斐波那契数列(记忆化搜索、简单DP) 题目链接:力扣 题目描述:   示例1: 输入:2输出:1解释:F(2) ...

【前言】

今天是刷题打卡第52天!

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

  

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

题目链接:力扣

题目描述:

 

示例1:


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

示例2:


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

方法一:暴力递归

代码执行:


  
  1. class Solution {
  2. public:
  3. int fib(int n){
  4. //方法一:暴力递归
  5. //找边界
  6. if(n == 0){
  7. return 0;
  8. }
  9. if(n == 1){
  10. return 1;
  11. }
  12. return fib(n - 1) + fib(n - 2);
  13. }
  14. };

上面的代码存在的问题:

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

  

方法二:循环求解

代码执行:

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


  
  1. class Solution {
  2. public:
  3. int fib(int n){
  4. //方法二:循环解决
  5. int a = 0;
  6. int b = 1;
  7. int cur = 0;
  8. for(int i = 1; i <= n; i++)//当n为0时直接cur = 0
  9. {
  10. cur = a + b;
  11. b = a;
  12. a = cur;
  13. }
  14. return cur;
  15. }
  16. };

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

思路:

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

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

  


  
  1. class Solution {
  2. public:
  3. int fib(int n){
  4. //方法三:记忆化搜索(简单DP)
  5. //找边界
  6. if(n == 0){
  7. return 0;
  8. }
  9. if(n == 1){
  10. return 1;
  11. }
  12. //需要定义一个大小为(n+1)的整形数组,并且初始化为0
  13. //之所以是n+1,是因为要使用到n这个下标
  14. vector<int> dp(n+1, 0);
  15. dp[0] = 0;
  16. dp[1] = 1;
  17. for(int i = 2; i < n+1; i++)
  18. {
  19. dp[i] = dp[i - 1] + dp[i - 2];
  20. }
  21. return dp[n];
  22. }
  23. };

结语

今天是刷题打卡第52天!

加油吧少年。

  

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121888470

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。