具体思想:
比之前见到的最长子序列问题更难;
用常规的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
*/