LeetCode 873. 最长的斐波那契子序列的长度**(double,need triple)

具体思想:

比之前见到的最长子序列问题更难;

用常规的vector<unordered_map<int,int>>会爆时间,个人认为可能是随着序列的增加,会导致遍历unordered_map的时间会增大;

题解思路是记录以(i,j)为结尾的最大长度;

二维枚举i,j,寻找前面是否有arr[j]-arr[i],如果存在则存在一个三位的佩波那契数列[arr[j]-arr[i],arr[i],arr[j]];

令arr[k]=arr[j]-arr[i];

由(k,i)+1得到(i,j)的序列;

这里注意一下,由于采用二维转一维的哈希标记,可以不用重复取max,又一遍降低了复杂度;

具体代码:

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {
        int n=arr.size();
        int ret=0;
        unordered_map<int, int>index2int;
        unordered_map<int, int>longset;
        for(int i=0;i<arr.size();i++){
            index2int[arr[i]]=i;
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                //longset[j*n+i]=2;
                int gap=arr[i]-arr[j];
                if(gap<arr[j]&&index2int.count(gap)){
                    int index=index2int[gap];
                    longset[j*n+i]=longset[index*n+j]+1;
                    ret=max(ret,longset[j*n+i]+2);
                }
            }
        }
        if(ret>=2)
            return ret;
        else
            return 0;
    }
};

/*
5 7
0 1
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值