微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列

求微软面试题:求整数随机数构成的数组中找到长度大于=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;
	}
}




原文地址:https://www.cnblogs.com/suncoolcat/p/3293806.html