Start learning free

LESSON 182 OF 410 · LOOPS - CHALLENGES

Tribonacci Number in O(n) Time and O(1) Space using Java

Practice Read the full explanation

The Tribonacci numbers, commonly denoted T(n) form a sequence, called the Tribonacci sequence, such that each number is the sum of the three preceding ones, starting from 0, 1 and 1. That is,

T(0) = 0, T(1) = 1, T(2) = 1
T(n) = T(n - 1) + T(n - 2) + T(n - 3), for n > 2.

Given n, calculate and return T(n).


Example 1:

Input: n = 3
Output: 2
Explanation: T(3) = T(2) + T(1) + T(0) = 1 + 1 + 0 = 2.

Example 2:

Input: n = 4
Output: 4
Explanation: T(4) = T(3) + T(2) + T(1) = 2 + 1 + 1 = 4.

Example 3:

Input: n = 5
Output: 7
Explanation: T(5) = T(4) + T(3) + T(2) = 4 + 2 + 1 = 7.

Note:

Your algorithm should run in O(n) time and use O(1) space.


STEP 1 OF 8
    Ctrl + Enter to check

    JAVA · LOOPS - CHALLENGES

    Tribonacci in Java, explained

    Understanding the Problem

    The core challenge of this problem is to compute the nth Tribonacci number efficiently. The Tribonacci sequence is similar to the Fibonacci sequence but instead of summing the last two numbers, we sum the last three numbers. This problem is significant in various applications such as dynamic programming and algorithm optimization.

    Approach

    To solve this problem, we can start with a naive recursive solution, but it will be highly inefficient due to repeated calculations. Instead, we can use an iterative approach to achieve O(n) time complexity and O(1) space complexity.

    Naive Recursive Solution

    The naive approach involves recursively calculating T(n) by summing T(n-1), T(n-2), and T(n-3). However, this approach has exponential time complexity due to overlapping subproblems.

    Optimized Iterative Solution

    We can optimize the solution by using an iterative approach with three variables to keep track of the last three Tribonacci numbers. This way, we can compute the result in O(n) time and O(1) space.

    Algorithm

    Here is a step-by-step breakdown of the optimized iterative algorithm:

    1. Initialize three variables to store T(0), T(1), and T(2).
    2. Iterate from 3 to n, updating the three variables to store the last three Tribonacci numbers.
    3. Return the nth Tribonacci number.

    Code Implementation

    
    public class Tribonacci {
        public int tribonacci(int n) {
            // Base cases
            if (n == 0) return 0;
            if (n == 1 || n == 2) return 1;
    
            // Initialize the first three Tribonacci numbers
            int t0 = 0, t1 = 1, t2 = 1;
    
            // Variable to store the current Tribonacci number
            int current = 0;
    
            // Iterate from 3 to n
            for (int i = 3; i <= n; i++) {
                // Calculate the current Tribonacci number
                current = t0 + t1 + t2;
    
                // Update the last three Tribonacci numbers
                t0 = t1;
                t1 = t2;
                t2 = current;
            }
    
            // Return the nth Tribonacci number
            return current;
        }
    
        public static void main(String[] args) {
            Tribonacci tribonacci = new Tribonacci();
            System.out.println(tribonacci.tribonacci(3)); // Output: 2
            System.out.println(tribonacci.tribonacci(4)); // Output: 4
            System.out.println(tribonacci.tribonacci(5)); // Output: 7
        }
    }
    

    Complexity Analysis

    The time complexity of the optimized iterative solution is O(n) because we iterate from 3 to n. The space complexity is O(1) because we only use a constant amount of extra space to store the last three Tribonacci numbers.

    Edge Cases

    Potential edge cases include:

    • n = 0: The output should be 0.
    • n = 1: The output should be 1.
    • n = 2: The output should be 1.

    These edge cases are handled by the base cases in the code.

    Testing

    To test the solution comprehensively, we should include a variety of test cases:

    • Simple cases: n = 0, 1, 2
    • Small values: n = 3, 4, 5
    • Large values: n = 25, 50

    We can use JUnit or any other testing framework to automate the testing process.

    Thinking and Problem-Solving Tips

    When approaching such problems, it is essential to:

    • Understand the problem statement and constraints thoroughly.
    • Start with a naive solution and identify its limitations.
    • Think about how to optimize the solution by reducing time and space complexity.
    • Practice solving similar problems to improve problem-solving skills.

    Conclusion

    In this blog post, we discussed the Tribonacci number problem, explored different approaches to solve it, and provided an optimized iterative solution in Java. Understanding and solving such problems is crucial for improving algorithmic thinking and coding skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free