LeetCode - 1137.第N个泰波那契数
目录
题目
解法
动态规划解法
核心思想
执行流程
具体例子
时间复杂度和空间复杂度
代码
题目
1137. 第 N 个泰波那契数 - 力扣(LeetCode)
解法
动态规划解法
核心思想
动态规划是一种通过将复杂问题分解为更小子问题来解决的算法方法。我将用第N个泰波那契数来演示这个概念。
泰波那契序列是斐波那契序列的变种,定义为:
- T(0) = 0
- T(1) = 1
- T(2) = 1
- T(n) = T(n-1) + T(n-2) + T(n-3) (n > 2)
动态规划的核心特点:
- 重叠子问题:相同子问题多次计算
- 最优子结构:问题的最优解包含子问题的最优解
- 状态转移:当前状态依赖于前面的状态
- 有明确的递推关系:T(n) = T(n-1) + T(n-2) + T(n-3)
通过存储已解决的子问题结果,动态规划避免了递归方法的重复计算,大大提高了效率。
执行流程
- 边界条件处理:直接返回T(0)=0, T(1)=1, T(2)=1的结果
- 创建DP表:建立大小为n+1的数组存储中间结果
- 初始化:设置dp[0]=0, dp[1]=1, dp[2]=1
- 状态转移:从i=3开始,使用公式dp[i] = dp[i-1] + dp[i-2] + dp[i-3]填表
- 返回结果:dp[n]即为所求
具体例子
计算T(4)的过程:
- 检查:n=4,不是边界情况
- 创建dp表:dp[0...4]
- 初始化:dp[0]=0, dp[1]=1, dp[2]=1
- 填表:
- i=3: dp[3] = dp[2] + dp[1] + dp[0] = 1 + 1 + 0 = 2
- i=4: dp[4] = dp[3] + dp[2] + dp[1] = 2 + 1 + 1 = 4
- 返回dp[4] = 4
示意图:
索引: 0 1 2 3 4
值: 0 1 1 2 4↑ ↑
时间复杂度和空间复杂度
- O(n): 需要从i=3计算到i=n,一共执行n-2次循环
- 每次循环是常数时间操作(简单加法)
- O(n): 需要一个长度为n+1的dp数组存储所有计算结果
代码
class Solution {
public:int tribonacci(int n) {//1.创建dp表//2.初始化//3.填表//4.返回值if(n==0){return 0;}if(n==1 || n==2){return 1;}vector<int> dp(n+1);dp[0] = 0,dp[1] = dp[2] = 1;for(int i =3;i<=n;i++){dp[i] = dp[i-1] + dp[i-2] + dp[i-3];}return dp[n];}
};