当前位置:   article > 正文

【力扣】1137. 第n个泰波那契数

【力扣】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. 返回值

  1. class Solution {
  2. public:
  3. int tribonacci(int n) {
  4. if(n==0) return 0; //处理一些边界情况
  5. if(n==1||n==2) return 1;
  6. vector<int> dp(n+1); //创建dp表
  7. dp[0]=0,dp[1]=dp[2]=1; //初始化
  8. for(int i=3;i<=n;i++){ //填表
  9. dp[i]=dp[i-3]+dp[i-2]+dp[i-1];
  10. }
  11. return dp[n]; //返回值
  12. }
  13. };

使用滚动数组进行空间优化后的代码

  1. class Solution {
  2. public:
  3. int tribonacci(int n) {
  4. if(n==0) return 0;
  5. if(n==1||n==2) return 1;
  6. int a=0,b=1,c=1,d=0;
  7. for(int i=3;i<=n;i++){
  8. d=a+b+c;
  9. a=b;b=c;c=d;
  10. }
  11. return d;
  12. }
  13. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/948560
推荐阅读
  

闽ICP备14008679号