zoukankan      html  css  js  c++  java
  • 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/

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    jQuery5事件相关
    jQuery4操作表单+属性+样式
    ueditor不能上传mp4格式的视频--解决方案
    笔记本怎么设置WIfi热点
    em rem vw vh
    字体的使用,坑爹啊!
    font的使用
    photoshop简单切图
    HTTP的学习
    call apply bind的联系与区别
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10583405.html
Copyright © 2011-2022 走看看