leetcode
leetcode 1051 ~ 1100
第 N 个泰波那契数

第 N 个泰波那契数

难度:

标签:

题目描述

代码结果

运行时间: 18 ms, 内存: 16.0 MB


/*
 * Problem: Tribonacci sequence Tn is defined as follows:
 * T0 = 0, T1 = 1, T2 = 1, and Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0
 * Given an integer n, return the nth Tribonacci number Tn.
 * 
 * Example 1:
 * Input: n = 4
 * Output: 4
 * Explanation:
 * T3 = 0 + 1 + 1 = 2
 * T4 = 1 + 1 + 2 = 4
 * 
 * Example 2:
 * Input: n = 25
 * Output: 1389537
 * 
 * Constraints:
 * 0 <= n <= 37
 * The answer is guaranteed to be a 32-bit integer, i.e., answer <= 2^31 - 1.
 */

import java.util.stream.IntStream;

public class TribonacciStream {
    public int tribonacci(int n) {
        if (n == 0) return 0;
        if (n == 1 || n == 2) return 1;
        int[] trib = {0, 1, 1};
        IntStream.range(3, n + 1).forEach(i -> {
            int next = trib[0] + trib[1] + trib[2];
            trib[0] = trib[1];
            trib[1] = trib[2];
            trib[2] = next;
        });
        return trib[2];
    }

    public static void main(String[] args) {
        TribonacciStream tribonacci = new TribonacciStream();
        System.out.println(tribonacci.tribonacci(4));  // Output: 4
        System.out.println(tribonacci.tribonacci(25)); // Output: 1389537
    }
}

解释

方法:

此题解采用迭代方法计算泰波那契数。首先初始化前三个泰波那契数 T0 = 0, T1 = 1, T2 = 1。针对 n 分别小于等于 0, 1, 2 的情况直接返回对应的泰波那契数值。对于 n 大于 2 的情况,使用一个 for 循环从 3 迭代到 n。在每次迭代中,计算当前泰波那契数为前三个数的和,然后更新这三个数,即使得 T0 = T1, T1 = T2, T2 = 新计算的和。最终,循环结束后返回 T2,即第 n 个泰波那契数。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在初始化时选择直接返回n=0, n=1, 和 n=2的情况,而不将它们包含在迭代循环中处理?
直接返回 n=0, n=1 和 n=2 的情况是为了简化代码和提高效率。因为这三个条件是泰波那契数列的基础情况,对它们的值已经确定(T0=0, T1=1, T2=1),不需要任何计算。如果将这些情况包含在迭代循环中,循环将执行不必要的迭代,因此,处理这些特殊情况可以避免不必要的计算并提高程序的执行速度。
🦆
在迭代过程中,每次更新T0, T1, T2的值,这种更新方式是否会影响计算的准确性或执行效率?
这种更新方式不会影响计算的准确性,因为每次迭代都正确地计算了泰波那契数的值,并按照预期更新了T0, T1, T2的值。从执行效率的角度看,这种更新方式是高效的,因为它仅使用有限的变量并在单个循环中完成所有操作,避免了额外的内存分配或不必要的计算。
🦆
迭代方法与递归方法相比,在解决这个问题时有哪些优势和劣势?
迭代方法的优势在于它通常具有更高的时间效率和更低的空间复杂度,因为它避免了递归调用栈的开销。迭代方法只使用固定数量的变量,而递归方法可能因为深度递归调用而导致栈溢出。然而,递归方法的代码通常更简洁易懂,尤其是在逻辑上直接模拟数学定义的情况下。迭代方法在理解和维护上可能稍微复杂一些,但在执行上通常更优。
🦆
给定题目中的n的最大值为37,这是否意味着在实际情况下,迭代方法的性能表现通常满足需求?
是的,给定 n 的最大值为 37,迭代方法在这种情况下的性能是完全可接受的。迭代方法因其简单和直接,能够快速计算出第 n 个泰波那契数,且不会占用过多的内存或处理时间。这使得迭代方法非常适合解决这类问题,特别是在问题的规模较小且明确定义的情况下。

相关问题

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

 

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

 

提示:

  • 1 <= n <= 45