LeetCode之最长斐波那契子序列的长度

一、题目描述

如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:

n >= 3
对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回  0 。

(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)

输入: [1,3,7,11,12,14,18]
输出: 3
解释:
最长的斐波那契式子序列有:
[1,11,12],[3,11,14] 以及 [7,11,18] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

输入: [1,2,3,4,5,6,7,8]
输出: 5
解释:
最长的斐波那契式子序列为:[1,2,3,5,8] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

本题可以采用动态规划的方法来解答,定义动态规划方程。

设斐波那契序列中的两个连续项A[i],A[j]表示为(i,j),则整个子序列就是这些连续结点的路径。

对于斐波那契子序列A[1]=1,A[2]=2,A[3]=3,A[5]=5,A[8]=8,连续结点的路径为(1,2)  (2,3)  (3,5)  (5,8)。

只有当A[i]+A[j]=A[k]时,结点(i,j) 、(j,k)才能组成连续的路径

设longest[i,j]表示  序列i到j的最长斐波那契子序列的长度则

longest[i,j]=Math.max(longest[i,j],longest[k,i]+1)  其中  k<i 且 A[k]+A[i]=A[j]

import java.util.*;
class Solution {
    public int lenLongestFibSubseq(int[] A) {
        int len=A.length;
        Map<Integer,Integer> valueIndex=new HashMap<Integer,Integer>();
        int [][]longest=new int[len][len];
        int maxValue=0;
        for (int i=0;i<len;i++){
            valueIndex.put(A[i],i);
        }
        for (int i=0;i<len;i++){
            for (int j=i+1;j<len;j++){
                longest[i][j]=2;
            }
        }
        for (int i=0;i<len;i++){
            for (int j=i+1;j<len;j++){
                int kValue=A[j]-A[i];
                if(valueIndex.containsKey(kValue)){
                    int kIndex=valueIndex.get(kValue);
                    if(kIndex<i)
                        longest[i][j]=Math.max(longest[i][j],longest[kIndex][i]+1);
                }
                maxValue=Math.max(maxValue,longest[i][j]);
            }
        }
        return maxValue>2?maxValue:0;
    }
}

解题思路参考官方题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值