数组中的等差数列 【微软面试100题 第九十四题】
题目要求
求随机数构成的数组中长度大于等于3的最长的等差数列,输出等差数列由小到大,如果没有符合条件的就输出。
例如输入{1,3,0,5,-1,6}
输出{-1,1,3,5}
代码实现
#include<iostream> #include<algorithm> #include<stack> using namespace std; void clear(stack<int > &ss)//清空栈 { while(ss.size()>0) ss.pop(); } void copy(stack<int > ss,stack<int> &max) //用栈ss 的内容去赋值 max栈 { while(!ss.empty()) { max.push(ss.top()); ss.pop(); } } int longest(int a[], int len) //求最长的等差数列 { sort(a,a+len); //先对数组进行排序 unsigned int max = 1;//记录最长的等差数列的长度 stack< int> ss;// 记录当前等差数列的元素 stack< int> maxstack;// 记录目前已知的最长等差数列的元素 for(int i=0;i<len;i++)//等差数列的第一个元素 { ss.push(a[i]); //第一个元素入栈 for(int j=i+1;j<len;j++)//等差数列的第二个元素 { ss.push(a[j]); //第二个元素入栈 int diff = a[j] - a[i];// 公差 int base = a[j];// 这个是查找下一个元素用 //int length = 2; for(int k = j+1;k<len;k++) { if(a[k] == (base+diff))// 如果当前等差数列的下一个元素是 a[k] { ss.push(a[k]); //a[k]入栈 //length++; base = a[k]; //更新base 为当前元素,查找下一个元素 base+diff即可 } } if(ss.size()>max)// 如果当前得到的最长数列,比已知的最长数列长 { max = ss.size(); //更新最长长度 clear(maxstack); //清空maxstack copy(ss,maxstack);// 更新最长数列的所有元素 } while(ss.size()>1)// 重新选择第二个元素 a[j],所以需要pop 所有元素只留下第一个 { ss.pop(); } } clear(ss); //清空ss ,重新选择第一个元素 a[i] } if(maxstack.size()>2) { while(maxstack.size()>0)// 输出最长的数列 { cout<<maxstack.top()<< " "; maxstack.pop(); } } if(max<3) return 0; cout<<endl; return max; } int main() { int a[] = {1,3,0,5,-1,-6}; // int a[] = {1,7,0,3,-4,-6}; int len = sizeof (a)/sizeof( int); cout<<longest(a,len)<<endl; return 0; }
很多时候不是我们做不好,而是没有竭尽全力......
posted on 2014-11-26 20:58 tractorman 阅读(638) 评论(0) 编辑 收藏 举报