参考:http://blog.youkuaiyun.com/zhanxinhang/article/details/6667868
题:求随机数构成的数组中找到长度大于=3的最长的等差数列
输出等差数列由小到大:
如果没有符合条件的就输出[0,0]
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小
#include <iostream>
#include <set>
using namespace std;
void function(multiset<int> &myset)
{
multiset<int>::const_iterator it1,it2;
int result_d,result_a1;
int curr_d,curr_pos=0,maxlen=0,count=0,i;
for(it1=myset.begin();it1!=myset.end();)
{
for(it2=it1,it2++;it2!=myset.end();)
{
curr_d = *it2 - *it1;
if(curr_d == 0)
{
count = myset.count(*it1);
it2 = myset.upper_bound(*it1);
}
else
{
count = 2;
while(myset.find(*it1 + count*curr_d) != myset.end())
count++;
it2 = myset.upper_bound(*it2);
}
if(count >maxlen)
{
maxlen = count;
result_d = curr_d;
result_a1 = *it1;
}
}
curr_pos += myset.count(*it1);
if(myset.size() - curr_pos < maxlen)
break;
it1 = myset.upper_bound(*it1);
}
if(maxlen < 3)
{
cout<<"没有最长等差数列"<<endl;
}
else
{
cout<<"最长等差数列为:";
for(int i=0;i<maxlen;i++)
cout<<result_a1+result_d*i<<" ";
cout<<endl;
}
}
int main()
{
int a[] = {1,3,0,5,-1,6};
int n = sizeof(a)/sizeof(int);
cout<<"数组为:";
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
multiset<int> myset;
myset.insert(a,a+6);
function(myset);
return 0;
}