LeetCode in Kotlin

873. Length of Longest Fibonacci Subsequence

Medium

A sequence x1, x2, ..., xn is Fibonacci-like if:

Given a strictly increasing array arr of positive integers forming a sequence, return the length of the longest Fibonacci-like subsequence of arr. If one does not exist, return 0.

A subsequence is derived from another sequence arr by deleting any number of elements (including none) from arr, without changing the order of the remaining elements. For example, [3, 5, 8] is a subsequence of [3, 4, 5, 6, 7, 8].

Example 1:

Input: arr = [1,2,3,4,5,6,7,8]

Output: 5

Explanation: The longest subsequence that is fibonacci-like: [1,2,3,5,8].

Example 2:

Input: arr = [1,3,7,11,12,14,18]

Output: 3

Explanation:: The longest subsequence that is fibonacci-like: [1,11,12], [3,11,14] or [7,11,18].

Constraints:

Solution

class Solution {
    fun lenLongestFibSubseq(arr: IntArray?): Int {
        if (arr == null || arr.size < 3) {
            return 0
        }
        val len = arr.size
        val dp = Array(len) { IntArray(len) }
        var ans = 0
        for (i in 2 until len) {
            var left = 0
            var right = i - 1
            while (left < right) {
                if (arr[left] + arr[right] < arr[i]) {
                    left++
                } else if (arr[left] + arr[right] > arr[i]) {
                    right--
                } else {
                    // dp[right][i] = Math.max(dp[right][i], dp[left][right] + 1);
                    dp[right][i] = dp[left][right] + 1
                    ans = Math.max(ans, dp[right][i])
                    left++
                    right--
                }
            }
        }
        return if (ans > 0) ans + 2 else 0
    }
}