剣はoffer93を指します:最長のフィボナッチ数列

質問:
シーケンスX_1、X_2、…、X_nは、次の条件を満たす場合、フィボナッチであると言われます。

  • n> = 3
  • すべてのi+2 <= nに対して、X_i + X_ {i + 1} = X_ {i+2}があります。

シーケンスarrを形成する正の整数の厳密に増加する配列が与えられた場合、arrで最も長いフィボナッチのようなサブシーケンスの長さを見つけます。存在しない場合は0を返します。
(サブシーケンスは、残りの要素の順序を変更せずにarrから任意の数の要素(またはなし)を削除することにより、元のシーケンスarrから派生することを思い出してください。たとえば、[3、5、8]は[3、 4、5、6、7、8 ])
例1:
入力:arr = [1,2,3,4,5,6,7,8]
出力:5
説明:の最長のフィボナッチのようなサブシーケンスは[ 1,2,3,5,8]。
例2:
入力:arr = [1,3,7,11,12,14,18]
出力:3
説明:最長のフィボナッチサブシーケンスは[1,11,12]、[3,11、14]および[7 、11,18]。
分析:
タイトルを変更するには、最適な解決策を見つける必要があるため、動的計画法を使用してこの問題を解決できます。
まず、状態遷移方程式を決定します。
配列をarrとしてマークし、arr [i]は配列内のiの添え字付きの数を表します。各j(0 <= j <i)について、arr[j]は特定のA数である可能性があります。フィボナッチ数列のarr[i]の前で、arr [k] + arr [j] = arr [i]を満たすak(0 <= k <j)がある場合、これら3つの数はフィボナッチ数列で構成されます。 。arr [i]で終わり、前の番号がarr [j]であるこのフィボナッチ数列は、arr [j]で終わり、前の番号がarr [k]。i]であるフィボナッチ数列であるため、前者の長さは次のようになります。後者の長さに1を加えたものに基づきます。
arr [i]で終わるフィボナッチ数列の長さは前の番号に依存するため、arr [j]、異なるarr[j]およびarr[i]は異なるフィボナッチ数列を形成する可能性があり、それらの長さも異なる可能性があります。状態遷移方程式には2つのパラメーターiとjがあります。f(i、j)はフィボナッチ数列を表し、arr [i]が最後の数、arr[j]が最後から2番目の数です。 arr [i] = arr [j] + arr [k]となる数k(0 <= k <j <i)、次にf(i、j)= f(j、k)+1。
ここに画像の説明を挿入
特定の実装の詳細については、コードを参照してください

コード:

import java.util.HashMap;
import java.util.Map;

public class LenLongestFiSubseq {
    
    
    public int lenLongestFibSubseq(int[] arr) {
    
    
    //使用一个哈希表map来记录每个数字在数组下的下标,通过哈希表可以用O(1)的时间来判断数组中是否存在一个数字arr[k]=arr[i]-arr[j].
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
    
    
            map.put(arr[i],i);
        }
        int[][] dp = new int[arr.length][arr.length];
        int result = 2;
        //i的范围是1到n-1,而j的范围是0到n-2
        for (int i = 1; i < arr.length; i++) {
    
    
            for (int j = 0; j < i; j++) {
    
    
                int k = map.getOrDefault(arr[i]-arr[j],-1);
                dp[i][j] = k>=0 && k < j ?dp[j][k]+1:2;
                result = Math.max(result,dp[i][j]);
            }
        }
        return result>2?result:0;
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Jiaodaqiaobiluo/article/details/122913908