N-th Tribonacci Number Problem

Problem

The Tribonacci sequence $T_n$ is defined as follows: 

$$ T_0 = 0, T_1 = 1, T_2 = 1, \text{ and }T_{n+3} = T_n + T_{n+1} + T_{n+2} \text{ for n} >= 0. $$

Given n, return the value of $T_n$.

Examples

Example 1:

Input:
n = 4
Output:
 4
Explanation:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

Example 2:

Input:
n = 25
Output:
 1389537

Solution

This problem is very similar to Generate Nth Fibonacci Number. Please refer to that for understanding the problem.

Method 1 - Recursion

Code

Java
  public static int tribonacci(int n) {
    if (n == 0) {
      return 0;
    } else if (n <= 2) {
      return 1;
    } else {
      return tribonacci(n - 1) + tribonacci(n - 2) + tribonacci(n - 3);
    }
  }

Complexity

  • Time: O(3^n) - As we branch out in 3 directions
  • Space: O(1)

Method 2 - Top Down DP with memoization

Code

Java
// Integer[] memo, as nulls are deduced as empty
public static int tribonacci(int n) {
	return tribMemo(n, new Integer[n+1]);
}


private static int tribMemo(int n, Integer[] memo) {
	if (memo[n] != -1) {
		return memo[n]; // Return cached value if available
	}

	if (n == 0) {
		return 0;
	} else if (n <= 2) {
		return 1;
	} else {
		memo[n] = tribMemo(n - 1, memo) + tribMemo(n - 2, memo) + tribMemo(n - 3, memo);
		return memo[n]; // Store and return calculated value
	}
}

Method 3 - Bottom up DP

Code

Java
public static int tribonacci(int n) {
	if (n == 0) {
		return 0;
	} else if (n <= 2) {
		return 1;
	}

	int[] dp = new int[n + 1];
	dp[0] = 0;
	dp[1] = dp[2] = 1;

	// Fill the table iteratively using the recurrence relation
	for (int i = 3; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
	}

	return dp[n];
}

Method 4 - DP - O(1)

Code

Java
public int tribonacci(int n) {
	if (n == 0) {
		return 0;
	}

	if (n <= 2) {
		return 1;
	}

	int first = 0, second = 1, third = 1, result = 0;

	for (int i = 3; i <= n; i++) {
		result = first + second + third;
		first = second;
		second = third;
		third = result;
	}

	return result;
}