【LeetCode】动态规划—第 N 个泰波那契数(附完整Python/C++代码)

动态规划—#1137. 第 N 个泰波那契数

  • 前言
  • 题目描述
  • 基本思路
    • 1. 泰波那契数列的定义:
    • 2. 理解递推关系:
    • 3. 解决方法:
    • 4. 进一步优化:
    • 5. 小总结:
  • 代码实现
    • Python3代码实现
    • Python 代码解释
    • C++代码实现
    • C++ 代码解释
  • 总结:

前言

泰波那契数列是斐波那契数列的扩展版本。在斐波那契数列中,下一项是前两项之和,而在泰波那契数列中,下一项是前三项的和。具体的定义是:

  • T ( θ ) = θ T(\theta)=\theta T(θ)=θ
  • T ( 1 ) = 1 T(1)=1 T(1)=1
  • T ( 2 ) = 1 T(2)=1 T(2)=1
  • 对于 n > = 3 , T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) n>=3, T(n)=T(n-1)+T(n-2)+T(n-3) n>=3,T(n)=T(n1)+T(n2)+T(n3)

问题要求的是,给定一个整数 n n n ,返回第 n n n 个泰波那契数。

题目描述

在这里插入图片描述

基本思路

1. 泰波那契数列的定义:

泰波那契数列是斐波那契数列的扩展版本。在斐波那契数列中,下一项是前两项之和,而在泰波那契数列中,下一项是前三项的和。具体的定义是:

  • T ( θ ) = θ T(\theta)=\theta T(θ)=θ
  • T ( 1 ) = 1 T(1)=1 T(1)=1
  • T ( 2 ) = 1 T(2)=1 T(2)=1
  • 对于 n > = 3 , T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) n>=3, T(n)=T(n-1)+T(n-2)+T(n-3) n>=3,T(n)=T(n1)+T(n2)+T(n3)

问题要求的是,给定一个整数 n n n ,返回第 n n n 个泰波那契数。

2. 理解递推关系:

根据泰波那契数列的定义:

  • θ \theta θ 项是 θ : T ( θ ) = 0 \theta: T(\theta)=0 θ:T(θ)=0
  • 第1项是 1: T ( 1 ) = 1 \mathrm{T}(1)=1 T(1)=1
  • 第 2 项是 1 : T ( 2 ) = 1 1: T(2)=1 1:T(2)=1
  • 对于 n > = 3 n>=3 n>=3, 每一项都是前三项的和: T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) T(n)=T(n-1)+T(n-2)+T(n-3) T(n)=T(n1)+T(n2)+T(n3)

例如:

  • T ( 3 ) = T ( 2 ) + T ( 1 ) + T ( θ ) = 1 + 1 + θ = 2 T(3)=T(2)+T(1)+T(\theta)=1+1+\theta=2 T(3)=T(2)+T(1)+T(θ)=1+1+θ=2
  • T ( 4 ) = T ( 3 ) + T ( 2 ) + T ( 1 ) = 2 + 1 + 1 = 4 T(4)=T(3)+T(2)+T(1)=2+1+1=4 T(4)=T(3)+T(2)+T(1)=2+1+1=4
  • T ( 5 ) = T ( 4 ) + T ( 3 ) + T ( 2 ) = 4 + 2 + 1 = 7 T(5)=T(4)+T(3)+T(2)=4+2+1=7 T(5)=T(4)+T(3)+T(2)=4+2+1=7

3. 解决方法:

我们可以用动态规划来解决这个问题,通过递推公式一步步计算出结果。基本步䯅如下:

  1. 初始条件:我们知道 T ( 0 ) = 0 , T ( 1 ) = 1 , T ( 2 ) = 1 T(0)=0 , T(1)=1 , T(2)=1 T(0)=0T(1)=1T(2)=1
  2. 递推公式:对于 n > = 3 n>=3 n>=3 的情况, T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) T(n)=T(n-1)+T(n-2)+T(n-3) T(n)=T(n1)+T(n2)+T(n3)
  3. 自底向上: 从 n = 3 n=3 n=3 开始,逐步计算到 T ( n ) T(n) T(n) ,每一步只依赖前三个数值,所以我们可以优化空间复杂度。

4. 进一步优化:

在实现动态规划时,我们可以使用一个数组来保存每个泰波那契数,但实际上,计算第 n n n 项时只需要知道前三项的值。因此,我们可以用三个变量来代替数组,从而优化空间复杂度为 0 ( 1 ) 0(1) 0(1) ,而时间复杂度仍然为 O ( n ) O(n) O(n)

5. 小总结:

  • 泰波那契数列的定义是: T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) T(n)=T(n-1)+T(n-2)+T(n-3) T(n)=T(n1)+T(n2)+T(n3) ,前面三项分别为 T ( 0 ) = 0 , T ( 1 ) T(0)=0 , T(1) T(0)=0T(1) = 1 , T ( 2 ) = 1 =1, T(2)=1 =1,T(2)=1
  • 我们可以通过动态规划自底向上计算,从 T ( 3 ) T(3) T(3) T ( n ) T(n) T(n) ,每次使用前面的三个数值进行计算。
  • 为了优化空间,我们可以使用常量空间的三个变量,避免使用数组。

以上就是泰波那契数问题的基本思路。

代码实现

Python3代码实现

class Solution:def tribonacci(self, n: int) -> int:# 特殊情况:直接返回前三个数的结果if n == 0:return 0elif n == 1 or n == 2:return 1# 初始化前3个数:T(0), T(1), T(2)t0, t1, t2 = 0, 1, 1# 从第3项开始计算到第n项for i in range(3, n + 1):# 当前的泰波那契数是前三项的和current = t0 + t1 + t2# 更新前面的三个数t0, t1, t2 = t1, t2, current# 返回第n项return t2

Python 代码解释

  1. Base Case: 对于 n = 0 , 1 , 2 n=0,1,2 n=0,1,2 ,直接返回相应的结果。
  2. 动态规划: 使用三个变量 t 0 , t 1 , t 2 t 0, t 1, t 2 t0,t1,t2 分别表示 T ( n − 3 ) , T ( n − 2 ) , T ( n − 1 ) T(n-3), T(n-2), T(n-1) T(n3),T(n2),T(n1) ,在循环中逐步更新,直到计算到 T ( n ) T(n) T(n)
  3. 时间复杂度: O ( n ) O(n) O(n) ,需要遍历计算到第 n n n 项。
  4. 空间复杂度: O ( 1 ) O(1) O(1) ,只使用了三个变量存储前面的值。

C++代码实现

class Solution {
public:int tribonacci(int n) {// 特殊情况:直接返回前三个数的结果if (n == 0) return 0;if (n == 1 || n == 2) return 1;// 初始化前3个数:T(0), T(1), T(2)int t0 = 0, t1 = 1, t2 = 1;// 从第3项开始计算到第n项for (int i = 3; i <= n; ++i) {// 当前的泰波那契数是前三项的和int current = t0 + t1 + t2;// 更新前面的三个数t0 = t1;t1 = t2;t2 = current;}// 返回第n项return t2;}
};

C++ 代码解释

  1. Base Case: 如果 n = = 0 , 1 , 2 n==0,1,2 n==0,1,2 ,直接返回结果。
  2. 动态规划: 使用三个变量 t θ , t 1 , t 2 t \theta, t 1, t 2 ,t1,t2 ,在每次循环中计算 T ( n ) T(n) T(n) 并更新这三个变量。
  3. 时间复杂度: O ( n ) O(n) O(n), 遍历计算每一项。
  4. 空间复杂度: O ( 1 ) O(1) O(1) ,只使用了常量空间存储计算过程。

总结:

  • Python 和 C++ 代码均使用动态规划和常量空间进行优化,保证了时间和空间的效率。
  • 通过递推公式 T ( n ) = T ( n − 1 ) + T ( n − 2 ) + T ( n − 3 ) T(n)=T(n-1)+T(n-2)+T(n-3) T(n)=T(n1)+T(n2)+T(n3) ,可以快速从 T ( 0 ) , T ( 1 ) , T ( 2 ) T(0), T(1), T(2) T(0),T(1),T(2) 逐步计算到第 n n n 项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543419.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

三款远控工具大比拼,哪款更胜一筹?

当我们处在日益便捷的数字化生活中&#xff0c;我们不仅需要在实体空间与物理环境间活动&#xff0c;我们更可以通过科技的力量在屏幕间自由穿梭&#xff1b;向日葵远程控制工具&#xff0c;就是这样一款能让你在指尖上体验到操作乐趣的神奇工具&#xff1b;今天&#xff0c;就…

着色器(Vertex Shader)基础

什么是顶点着色器 顶点着色器处理顶点并告知它们在“剪辑空间”中的坐标,该空间使计算机可以轻松了解哪些顶点对摄像机可见,哪些顶点不可见,必须剪切或“剪切”掉。 这使得 GPU 在后期阶段的速度更快,因为它们需要处理的数据较少。 它们通过接收来自顶点列表中的单个顶…

优可测一键闪测仪:实现冲压端子的快速精准尺寸检测

上期&#xff0c;小优博士讲述了和白光干涉仪在红外探测行业的应用与优势&#xff0c;今天&#xff0c;小优博士为大家继续带来&#xff1a; 《优可测一键式影像测量仪&#xff1a;实现冲压端子的快速精准尺寸检测》 冲压端子是通过金属冲压工艺制成&#xff0c;用于电气导线与…

排序题目:将矩阵按对角线排序

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;将矩阵按对角线排序 出处&#xff1a;1329. 将矩阵按对角线排序 难度 5 级 题目描述 要求 矩阵对角线是一条从矩阵最上面行或者最左侧列中的某…

【C++代码运行结果测试】基类与派生类的成员变量值的调用结果

【铺垫】派生类对象可被基类指针所指向&#xff0c;效果与被派生类指针指向等效 【代码测试1】15浙工大卷一读程序5题代码改 【代码测试2】C教辅p206例7.21 【代码1】15浙工大卷一读程序5题代码改 #include "bits/stdc.h" #include<iostream> using namesp…

谷歌发布新 RL 方法,性能提升巨大;苹果前设计总监正与 OpenAI 合作开发 AI 设备丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图

摘要&#xff1a;本研究有效提高了动态环境中障碍物建模的精度和效率。NOKOV度量动作捕捉系统助力评估动态占用地图在速度估计方面的性能。 近日&#xff0c;上海交通大学、荷兰代尔夫特理工研究团队在机器人顶刊IEEE T-RO上发表题为Continuous Occupancy Mapping in Dynamic …

数据加密和数字证书

1 什么是数据加密 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程…

人工智能课程实训方案

第一章 发展背景 当今&#xff0c;世界无时无刻不在发生着变化。对于技术领域而言&#xff0c;普遍存在的一个巨大变化就是为大数据&#xff08;Big data&#xff09;打开了大门。随着国家大数据战略推进实施以及配套政策的贯彻落实&#xff0c;大数据产业发展环境进一步优化&a…

Tauri 应用 input 输入自动大写问题定位解决

使用 Tauri React 开发 MinApi(http api接口测试工具) 时&#xff0c;在 Mac 系统中遇到一个很奇怪的问题&#xff1a;在 input 输入框中输入内容时&#xff0c;如果输入的是全小写英文字母&#xff0c;会自动将首字母转换为大写&#xff0c;效果如下图所示。 问题定位 经过排…

JS执行机制(同步和异步)

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 异步:在做这件事的同时&#xff0c;你还可以去处理其他事 他们的本质区别&#xff1a;这条流水线上各个流程的执行顺序不同。 同步任务 同步任务都在主线程上执行&#xff0c;形成一个执行栈。 异步…

asp.net core grpc快速入门

环境 .net 8 vs2022 创建 gRPC 服务器 一定要勾选Https 安装Nuget包 <PackageReference Include"Google.Protobuf" Version"3.28.2" /> <PackageReference Include"Grpc.AspNetCore" Version"2.66.0" /> <PackageR…

统信服务器操作系统a版e版【dde桌面限制登录次数】介绍

dde桌面登录规则、tty限制登录次数、ssh限制登录次数、ssh限制地点登录、本地限制终端登录、时间限制登录等内容 文章目录 功能概述功能介绍1.查看dde桌面登录规则2.tty限制登录次数3.ssh限制登录次数4.ssh限制地点登录5.本地限制终端登录6.时间限制登录 功能概述 限制dde桌面…

【计算机基础】用bat命令将Unity导出PC包转成单个exe可执行文件

Unity打包成exe可执行文件 上边连接是很久以前用过的方法&#xff0c;发现操作有些不一样了&#xff0c;并且如果按上述操作比较麻烦&#xff0c;所以写了个bat命令。 图1、导出的pc程序 如图1是导出的pc程序&#xff0c;点击exe文件可运行该程序。 添加pack_project.bat文件 …

自学前端的正确姿势是...

师傅带进门&#xff0c;修行在个人。 在前端自学成才的道路上&#xff0c;有些人走的很快&#xff0c;有些人却举步维艰。 为什么会这样子呢&#xff1f;因为他们没有掌握自学前端的正确姿势。 在介绍应该要怎样自学前端之前&#xff0c;首先来看下&#xff0c;自学前端容易…

vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

一、前端路由的概念与原理 路由router就是对应关系。分为前端路由和后端路由。 1后端路由 后端路由指的是&#xff1a;请求方式、请求地址与function处理函数之间的对应关系。在node.js中&#xff0c;express理由的基本用法如下&#xff1a; const express require(expres…

【C语言从不挂科到高绩点】21-指针03-指针与函数【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

死磕P7: JVM内存划分必知必会(一)

这是「死磕P7」系列第 001 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 JVM 内存区域划分是面试常考点&#xff0c;属于死记硬背型&#xff0c;比较让人头大的是不同版本的 JDK 具有不同的划分方式&…

Shopee虾皮双十大促:广告到底怎么做?需要使用动态代理吗?

在Shopee虾皮下半年的大促活动中&#xff0c;即将到来的10.10超级品牌节就是下半年各个超级购物节的其中一个&#xff0c;抓住本次大促的机会&#xff0c;卖家就有机会在更短的决策时间内实现更高的转化。大促期间最重要的环节之一就是广告投放&#xff0c;而广告投放又有什么技…