当前位置: 首页 > article >正文

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数

文章目录

      • [动态规划] (一) LeetCode 1137.第N个泰波那契数
        • 题目解析
        • 解题思路
          • 状态表示
          • 状态转移方程
          • 初始化和填表顺序
          • 返回值
        • 代码实现
        • 总结
        • 空间优化
          • 代码实现
        • 总结

1137. 第 N 个泰波那契数

题目解析

image-20231028220409948

解题思路
状态表示

(1) 题目要求

(2) 经验+题目要求

(3) 分析问题发现重复子问题

dp[i]的含义:dp[i]表示第N个泰波纳切数。

状态转移方程

由题意得:

dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
初始化和填表顺序

初始化:填表时保证不越界

填表顺序:保证之前的状态已经计算过了,所以是从左向右

返回值

题目要求+状态表示

返回第n个泰波那契数:return dp[n]。

代码实现
class Solution {
public:
    int tribonacci(int n) {
        //处理边界情况
        if(n == 0) return 0;
        else if(n == 1 || n == 2) return 1;
        //1.创建dp表
        vector<int> dp(n+1);
        //2.初始化
        dp[0] = 0, dp[1] = 1, dp[2] = 1;
        for(int i = 3; i <= n; i++)
        {
            //3.填表
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        }
        //返回值
        return dp[n];
    }
};

image-20231028215404127

总结

细节1:注意处理边界情况。

细节2:开辟容器时初始化(n+1)个空间,数组下标从0开始。

细节3:遍历完整的n,i <= n

时间复杂度:O(n)

空间复杂度:O(n)

空间优化

滚动数组:

dp[3] = dp[2] + dp[1] + dp[0]

dp[4] = dp[3] + dp[2] + dp[1],没有使用到dp[0]

dp[5] = dp[4] + dp[3] + dp[2],没有使用到dp[1], dp[0]。

造成了空间的浪费,所以我们可以定义4个变量a, b, c, d来循环写入dp[i]。

a = 0, b = 1, c = 1, d = a+b+c

a = b, b = c, c = d, d = a+b+c(如果反过来,就会让 a = b = c 和d一样了)

代码实现
class Solution {
public:
    int tribonacci(int n) {
        if(n == 0) return 0;
        else if(n == 1 || n == 2) return 1;
        int a = 0, b = 1, c = 1;
        int d = 0;
        for(int i = 3; i <= n; i++)
        {
            d = a + b + c;
            a = b, b = c, c = d;
        }
        return d;
    }
};

image-20231028221407298

总结

时间复杂度:O(N) 空间复杂度:O(1)


http://www.kler.cn/a/109188.html

相关文章:

  • Android OpenGL ES详解——立方体贴图
  • mac终端使用pytest执行iOS UI自动化测试方法
  • 以色列支付龙头遭DDoS攻击,各地超市加油站等POS机瘫痪
  • 【go从零单排】Timer、Epoch 时间函数
  • 使用支付宝沙箱完成商品下单
  • 【LeetCode】【算法】55. 跳跃游戏
  • 刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)
  • An Early Evaluation of GPT-4V(ision)
  • GORM GEN 生成代码如何自定义方法和表名
  • 学习gorm:彻底弄懂Find、Take、First和Last函数的区别
  • 02【Git分支的使用、Git回退、还原】
  • rust重载比较运算符
  • 前端 :用HTML , CSS ,JS 做一个秒表
  • CN考研真题知识点二轮归纳(1)
  • 【Unity PlasticSCM】记录:从介绍 下载 到拉取项目
  • 让谷歌插件单独一个窗口运行
  • TSINGSEE青犀基于AI视频识别技术的平安校园安防视频监控方案
  • 无法查看 spring-boot-starter-parent的pom.xml
  • Linux命令(108)之dirname
  • Mybatis 动态SQL
  • Python mysql 封装备用
  • Go学习第十六章——Gin文件上传与下载
  • Vue路由
  • 基于单片机的温湿度和二氧化碳检测系统设计
  • TensorFlow图像多标签分类实例
  • 【鸿蒙软件开发】ArkTS基础组件之TextTimer(文本显示计时)、TimePicker(时间选择)