快速入门动态规划之《第N个泰波那契数》(JAVA)

目录

动态规划五部曲:

一. 状态表示

二. 状态转移方程

三.  初始化

四. 填表顺序

五. 返回值

空间优化


力扣链接如下:

https://leetcode.cn/problems/n-th-tribonacci-number/

泰波那契序列 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。 

动态规划五部曲:

一. 状态表示

使用一个一维数组来表示状态,在这个题目中创建一个一维数组,用dp[i]表示第i个状态的值。

二. 状态转移方程

从题目中T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下Tn+3 = Tn + Tn+1 + Tn+2我们可以得出,dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3],比如说,第3个数就是dp[3] = dp[3 - 1] + dp[3 - 2] + dp[3 - 3]就是1+1+0=2。

三.  初始化

保证数组不越界,从0开始,前面三个数已经告诉我们了,所以可以写一个if语句判断直接return就行,我我们从第三个数开始,因为如果求的是第1个数带入dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]方程,就会发现dp[1-2]为负数,此时数组越界。

四. 填表顺序

因为我们要保证求的数前三位已经被计算出,所以从左往右开始计算。

五. 返回值

在这道题中,最后应该返回dp[n]的值。

代码如下

class Solution {
    public int tribonacci(int n) {
        if(n==0){
            return 0;
        }
        if(n==1||n==2){
            return 1;
        }
        int[] dp=new int[n+1];
        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];

    }
}

空间优化

这道题可以有一个空间优化

我们可以用一些变量来代替,众所周知,D是由前三个数加起来得出的,我们可以把B赋值给A,C赋值给B,D赋值给C,最后return D即可。

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;
       

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值