leetcode 1137.第n个泰波那契数

54 阅读2分钟

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

一.dp表

首先,我们需要写一个dp表,然后把这个dp表填满,这个dp表的的某一个值的状态就是我们要求的结果。

image.png

二.状态表示

状态表示怎么来的,一般三个点:

image.png

这道题我们直接从题目中就可以获取状态表示,首先,dp[1]就是第一个泰波那契数,dp[2]就第二个泰波那契数 dp[i]就是第i个泰波那契数

三.转移方程

我们根据题目要求,列出转移方程 dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

题目要求我们返回第n个泰波那契数, 那我们的最终return dp[n]

四.初始化

初始化有两个目的:

填表

防止越界

六.填表顺序

填表顺序目的:填当前位置时前面的位置已经被填过了

image.png

比如我想填4这个位置的值,但是3没与被填,那我4就求不了,必须先把3这个位置填了我4的位置才能填,因此我们这道题的填表顺序时从左到右。

七.边界问题

泰波那契数最少要求有3个数,所以如果n小于3需要特殊处理一下:

        if(n==0)return 0;

        if(n==1||n==2)return 1;

code

public:
    int tribonacci(int n) {
        //1.dp表
        //2.初始化
        //3.填表
        //4.return

        //边界问题
        if(n==0)return 0;

        if(n==1||n==2)return 1;
        //1。
        vector<int> dp(n+1);

        //2.
        dp[0]=0,dp[1]=dp[2]=1;

        //3.
        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }

        return dp[n];
    }
};

空间优化

滚动数组

abcd四个变量,d=a+b+c 求完d之后整体向后挪动 再求d。

image.png

code

class Solution {
public:
    int tribonacci(int n) {
        //1.dp表
        //2.初始化
        //3.填表
        //4.return

        //边界问题
        if(n==0)return 0;

        if(n==1||n==2)return 1;
        //1。
        vector<int> dp(n+1);

        int a=0,b=1,c=1,d=0;


        //3.
        for(int i=3;i<=n;i++)
        {
            d=a+b+c;
            //滚动操作
            a=b;
            b=c;
            c=d;
        }

        return d;
    }
};