本文主要是介绍【力扣】1137. 第n个泰波那契数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原题链接:. - 力扣(LeetCode)
目录
1. 题目描述
2. 思路分析
3. 代码实现
1. 题目描述
泰波那契序列 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
。
2. 思路分析
dp。
1. 状态表示:dp[i]表示第i个泰波那契数的值。(状态表示就是是什么的意思,也就是dp表里面的值所表示的含义)
2. 状态转移方程:dp[i]=dp[i-3]+dp[i-2]+dp[i-1] (将 n-3代入题目给的 Tn+3 = Tn + Tn+1 + Tn+2 这个式子得到)
3. 初始化:dp[0]=0,dp[1]=dp[2]=1(这一步是为了保证填dp表的时候不越界)
4. 填表顺序:从左向右(为了填写当前状态的时候,所需要的状态计算过了)
5. 返回值:因为题目要求的是第n个泰波那契数,所以返回dp[n]即可
空间优化——使用滚动数组
我们求dp[4]时,只需要知道dp[1],dp[2],dp[3]的值即可,此时dp[0]这个元素的空间相当于浪费了;同理我们求dp[5]时,只需要知道dp[2],dp[3],dp[4]这三个元素,此时dp[0]和dp[1]这两个元素的空间相当于浪费了。此时我们就可以用滚动数组进行优化,滚动数组也可以运用到dp中经典的背包问题。
3. 代码实现
处理一些边界情况(因为0<=n<=37,当n==0时,此时相当于vector<int> dp(1),dp[1]和dp[2]就越界了,所以我们需要特判。)
1. 创建dp表
2. 初始化
3. 填表
4. 返回值
class Solution {
public:int tribonacci(int n) {if(n==0) return 0; //处理一些边界情况if(n==1||n==2) return 1;vector<int> dp(n+1); //创建dp表dp[0]=0,dp[1]=dp[2]=1; //初始化for(int i=3;i<=n;i++){ //填表dp[i]=dp[i-3]+dp[i-2]+dp[i-1];}return dp[n]; //返回值}
};
使用滚动数组进行空间优化后的代码
class Solution {
public: int tribonacci(int n) {if(n==0) return 0;if(n==1||n==2) return 1;int a=0,b=1,c=1,d=0;for(int i=3;i<=n;i++){d=a+b+c;a=b;b=c;c=d;}return d;}
};
这篇关于【力扣】1137. 第n个泰波那契数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!