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

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

统计

点击右上角即可分享
微信分享提示