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

每日一道leetcode

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

题目

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:

输入:n = 25
输出:1389537

提示:

  • 0 <= n <= 37
  • 答案保证是一个 32 位整数,即 answer <= 2^31 - 1

思路

  1. 这题主要就是了解一下动态规划的机制,即当前节点的计算不用从头开始,直接继承前几个节点的状态即可。
  2. 所以只用考虑好边界情况,即当n<=2时,需要把3个初始值给直接输出;一旦n>2,则进行n-3轮的动态更新Tn = Tn-3+Tn-2+Tn-1。

代码实现

class Solution {
public:int tribonacci(int n) {int t0, t1 = 1, t2 = 1, nxt;if(n == 0) return 0;else if(n == 1 || n == 2) return 1;else {for(int i = 3; i <= n; i++) {nxt = t0 + t1 + t2;t0 = t1;t1 = t2;t2 = nxt;}}return nxt;}
};

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

官方题解

  • 先精简一下我的实现里的一些dirty的步骤,n==1 || n==2的部分可以改为n<=2,这样效率就高了(虽然完全影响不大hhh)。
  • 有点逆天,竟然还真的有代码更长但是效率更高的解法,叫矩阵快速幂的实现方法,不过不想实现了,只写写思路。
  • 首先看看官解的一个矩阵乘法的推导(感觉要构造这么个矩阵就已经超过我的数学基础了),首先以这么个构造来建立矩阵乘法,即通过堆M进行幂运算再与初始矩阵做矩阵乘最后取第三行(即下标为2)的值即可。
  • 为什么说这是效率更高的计算,在于幂运算是可以将时间复杂度降到O(logn)的,那么相比于O(n)的动态规划确实就效率增长了,现在来看看这个算法的思路:
  • 假设两种情况,n为奇数或n为偶数:
    • 当n为奇数时,x^n = x*(x^(n-1)) = x*(x^((n-1)/2)*x^((n-1)/2)) = ...。
    • 当n为偶数时,x^n = x^(n/2)*x^(n/2)) = ...。
    • 那么每一次运算都能把运算数量减半,最后的总的时间复杂度就是O(logn)的了。
  • 接下来就是实现了,首先得实现一个矩阵乘的函数,涉及9*3次乘法运算和9*2次加法运算以及9*1次赋值。
  • 当n小于等于2时,直接送上初始值,如果大于2时,则开始矩阵的幂运算。
  • 令x等于初始矩阵M,每次运算都让x = x * x,总共计算logn轮,通过n/2的结果来控制运算的边界(这里可以用过n>>1来更高效地达到同样的效果)。
    • 若是递归实现,则最后当n=0时返回1作为最尾端的控制,其余情况当n为偶数是则递归调用x^(n/2)*x^(n/2);当n为奇数时,则x*(x^((n-1)/2)*x^((n-1)/2))。
    • 若是非递归实现,讲讲官解的实现吧:
      • 每轮先判断(n&1) == 1,若是,则更新结果,否则不断地n>>1,并矩阵乘更新矩阵,直到n<=0停止。那么每轮当是奇数的时候,单独对结果进行一次单独乘上一轮矩阵的行为,不影响矩阵幂乘的过程。如果是偶数时,到最后也会到达1,会将最后的矩阵直接乘给ret。
      • 具体看官解的实现(我感觉还挺巧妙的,但是要想想):
http://www.xdnf.cn/news/4543.html

相关文章:

  • SCADA|KingSCADA运行报错:加载实时库服务失败
  • git 入门使用教程
  • 全国通用Y1大型游乐设施修理作业证精选题
  • PTS-G5K13M RF Generator 5kW / 13MHz 射频电源User s Manual
  • Spring Boot 如何自动配置事务管理器?
  • 数据结构之线性表
  • 阿里云codeup以及本地gitclone+http
  • Mybatis标签使用 -association 绑定对象,collection 绑定集合
  • ROS第十三梯:RViz+Marker——自定义几何形状可视化
  • 深度学习模型的部署实践与Web框架选择
  • 淘宝按图搜索商品(拍立淘)Java 爬虫实战指南
  • 拉削丝锥,螺纹类加工的选择之一
  • 1.3 Expression.Lambda表达式树的介绍
  • LWIP的超时事件笔记
  • 【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成
  • vllm命令行启动方式并发性能实测
  • 联想Horizon 2系列电脑 参数
  • SpringBoot学生宿舍管理系统开发实现
  • 浏览器跨标签通信的实现原理
  • feign负载均衡
  • linux(centos)联网情况下部署
  • 第一章——typec电路
  • SpirngAI框架 Advisor API详解
  • 【无标题】如何在sheel中运行Spark
  • 基于Django框架开发的企业级IT资产管理系统
  • Topic和Partition的关系是什么?为什么需要分区? (Topic是逻辑分类,Partition是物理分片;提升并行度和扩展性)
  • 【信息系统项目管理师-论文真题】2005下半年论文详解(包括解题思路和写作要点)
  • mint系统详解详细解释
  • 开源数学推理模型DeepSeek-Prover-V2:88.9%通过率+超长推理链
  • 数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力