873. Length of Longest Fibonacci Subsequence

A sequence X_1, X_2, ..., X_n is fibonacci-like if:

  • n >= 3
  • X_i + X_{i+1} = X_{i+2} for all i + 2 <= n

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

(Recall that a subsequence is derived from another sequence A by deleting any number of elements (including none) from A, 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: [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: [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].

Note:

  • 3 <= A.length <= 1000
  • 1 <= A[0] < A[1] < ... < A[A.length - 1] <= 10^9
  • (The time limit has been reduced by 50% for submissions in Java, C, and C++.)

Approach #1: unordered_map. [C++]

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& A) {
        unordered_map<int, int> memo;
        int len = A.size();
        int ans = 0, temp = 0;
        for (int i = 0; i < len; ++i)
            memo[A[i]] = i;
        for (int i = 0; i < len; ++i) {
            for (int j = i + 1; j < len; ++j) {
                int ant = 2;
                int last_idx = i;
                for (int cur_idx = j; cur_idx < len; ) {
                    temp = A[last_idx] + A[cur_idx];
                    if (memo.count(temp)) {
                        ant++;
                        last_idx = cur_idx;
                        cur_idx = memo[temp];
                    } else break;
                }
                ans = max(ans, ant);
            }
        }
        return ans == 2 ? 0 : ans;
    }
};

  

Approach #2: DP. [Java]

class Solution {
    public int lenLongestFibSubseq(int[] A) {
        int n = A.length;
        int res = 0;
        int[][] dp = new int[n+1][n+1];
        for (int[] row : dp) Arrays.fill(row, 2);
        Map<Integer, Integer> pos = new HashMap<>();
        for (int i = 0; i < n; ++i) pos.put(A[i], i);
        for (int j = 2; j < n; ++j) {
            for (int i = j-1; i > 0; --i) {
                int prev = A[j] - A[i];
                if (prev >= A[i]) break;
                if (!pos.containsKey(prev)) continue;
                dp[i][j] = dp[pos.get(prev)][i] + 1;
                res = Math.max(res, dp[i][j]);
            }
        }
        return res;
    }
}

  

Analysis:

http://zxi.mytechroad.com/blog/dynamic-programming/leetcode-873-length-of-longest-fibonacci-subsequence/

原文地址:https://www.cnblogs.com/ruruozhenhao/p/10583405.html

时间: 2024-08-06 23:36:08

873. Length of Longest Fibonacci Subsequence的相关文章

LC 873. Length of Longest Fibonacci Subsequence

A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 <= n Given a strictly increasing array A of positive integers forming a sequence, find the length of the longest fibonacci-like subsequence of A.  If on

Length of Longest Fibonacci Subsequence LT873

A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 <= n Given a strictly increasing array A of positive integers forming a sequence, find the length of the longest fibonacci-like subsequence of A.  If on

Longest Common Subsequence

Problem statement: Given two strings, find the longest common subsequence (LCS). Your code should return the length of LCS. Have you met this question in a real interview? Yes Clarification What's the definition of Longest Common Subsequence? https:/

300. Longest Increasing Subsequence

Problem statement: Given an unsorted array of integers, find the length of longest increasing subsequence. For example,Given [10, 9, 2, 5, 3, 7, 101, 18],The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there

[LeetCode][JavaScript]Longest Increasing Subsequence

Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest increasing subsequence. For example,Given [10, 9, 2, 5, 3, 7, 101, 18],The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Not

LeetCode 300. Longest Increasing Subsequence

300. Longest Increasing Subsequence Description Submission Solutions Add to List Total Accepted: 64115 Total Submissions: 170859 Difficulty: Medium Contributors: Admin Given an unsorted array of integers, find the length of longest increasing subsequ

Longest Common Subsequence (DP)

Given two strings, find the longest common subsequence (LCS). Your code should return the length of LCS. Example For "ABCD" and "EDCA", the LCS is "A" (or "D", "C"), return 1. For "ABCD" and &quo

【LeetCode从零单刷】Longest Increasing Subsequence

题目: Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given [10, 9, 2, 5, 3, 7, 101, 18], The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there may be more

2017-5-14 湘潭市赛 Longest Common Subsequence 想法题

Longest Common Subsequence Accepted : 7 Submit : 66 Time Limit : 3000 MS Memory Limit : 65536 KB Longest Common Subsequence Bobo has a sequence A=(a1,a2,-,an) of length n. He would like to know f(0),f(1),f(2) and f(3) where f(k) denotes the number of