• 数组中的等差数列 【微软面试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;
    }
  • 相关阅读:
    关于gulp的压缩js和css
    关于vant的定制主题问题
    关于jquery-Validate
    关于bootstrap-table插件的问题
    Windows下sass无法编译
    Hibernate基础知识整理(三)
    Hibernate基础知识整理(二)
    Hibernate基础知识整理(一)
    学习Hibernate之Eclipse安装hibernate tools插件
    JDBC连接池的cvalidationQuery设置 (参考)
  • 原文地址:https://www.cnblogs.com/tractorman/p/4124901.html
Copyright © 2020-2023  润新知