数组中的等差数列 【微软面试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  阅读(643)  评论(0编辑  收藏  举报

导航