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