#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
//每次选两个元素为基准,以他们为开头寻找最长斐波那契子数列
vector<int> Findlongestfibonaccisequence(vector<int> arr)
{
//无序集合用于查找与前两个元素和相等的元素
unordered_set<int> us(arr.begin(),arr.end());
vector<int> result;
int n = arr.size();
int maxlenth = 0;
//两个for循环保证所有两个元素排列的组合被检验到
for(int i=0;i<n-2;i++)
for (int j = i+1; j < n - 1; j++)
{
//保证前者大于后者
if (arr[i] > arr[j])
continue;
int a = arr[i];
int b = arr[j];
int lenth = 2;
//循环中初始化数组,再赋值给result
vector<int> tem = { a,b };
//如果找不到会返回指向end的迭代器
while (us.find(a + b) != us.end())
{
int c = a + b;
a = b;//a被赋b值,变成新的前者
b = c;
lenth++;
tem.push_back(c);
}
if (lenth > maxlenth)
{
maxlenth = lenth;
result = tem;
}
}
//斐波那契数列最小大小为3
//若找不到返回空向量
if (maxlenth < 3)
result.clear();
return result;
}
int main()
{
vector<int> a = { 1,2,3,4,5,6,7,8 };
vector<int> longest=Findlongestfibonaccisequence(a);
cout << "最长斐波那契子序列为:" << endl;
for (auto it : longest)
cout << it << " ";//此处it不用解引用
system("pause");
}
it
不需要加星号(*
),是因为当使用范围for循环遍历vector
时,每个元素直接以值的形式被迭代取出,而非指针或引用。auto it : longest
这一行的意思是对于longest
中的每一个元素,it被自动推导类型为int,并直接使用这个变量来代表当前迭代到的元素值。