求微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
输出等差数列由小到大:
如果没有符合条件的就输出[0,0]
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小
这里我还没有想到更好的办法,目前只实现了一个sb版本的时间复杂度为O(n^3)的算法。。暴力破解。。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void main()
{
int data[]={1,3,0,5,-1,6};
int length=sizeof(data)/sizeof(int);
sort(data,data+length-1);
int maxLength=0;
int i;
int j;
vector<int> max_v; //存放最大的那个队列的元素
vector<int> temp_v; //临时存放等差数列的元素
bool isChange=false;
for(i=0;i<length;i++)
{
for(j=i+1;j<length;j++)
{
isChange=false; //标记最大长度是否改变
int temp_length=2;
int temp_sub=data[j]-data[i]; //得到差值
int k;
int index_compare=j;
temp_v.push_back(i);
temp_v.push_back(j);
for(k=j+1;k<length;k++)
{
if(data[k]-data[index_compare]==temp_sub)
{
temp_v.push_back(k);
index_compare=k; //每次都要改变下个数要比较的那个数,例如:1,2,3,4中,在2的时候要比较的是1,3对应2,4对应3.
temp_length++;
if(temp_length>maxLength)
{
isChange=true;
maxLength=temp_length;
}
}
}
if(isChange)
max_v=temp_v;
temp_v.clear();
}
}
cout<<maxLength<<endl;
vector<int>::iterator it_v=max_v.begin();
while(it_v!=max_v.end())
{
cout<<data[(*it_v)]<<" ";
++it_v;
}
}