最长斐波那契数列 (哈希表,动态规划)
示例 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] 。
class Solution {
public:
int lenLongestFibSubseq(vector<int>& arr) {
unordered_map<int, int> hashtable;
for(int i=0;i<arr.size();i++){ //把arr中数放哈希表hashtable中
hashtable[arr[i]]=i; //以后对哈希表操作
}
vector<int> occ;
int ans=0; //斐波那契数要么>=3,要么=0
for(int i=1;i<arr.size();i++){
for(int j=0;j<i;j++){
//动态规划:用于找可以形成>=3个斐波那契数列的前两个数
if(hashtable.count(arr[i]+arr[j])){ //如果可以在哈希表中找到动态规划遍历得到的前两个数的和,将三个数存到vector occ中
occ.clear(); //每次存occ斐波那契数列的前三个数前都得清空occ
occ.push_back(arr[j]);
occ.push_back(arr[i]);
occ.push_back(arr[i]+arr[j]);
while(hashtable.count(occ[occ.size()-1]+occ[occ.size()-2])){//如果能在哈希表中找到occ中后两个数和,把和压入occ
occ.push_back(occ[occ.size()-1]+occ[occ.size()-2]);
}
ans=max(ans,int(occ.size()));
}
}
}
return ans;
}
};