3311. 最长算术 知识点:差分

85 阅读1分钟

3311. 最长算术 - AcWing题库

差分思想

image.png

差分数组村每个区间的差值。当差值不一样的时候说明不在一个区间了,这个时候比较每个区间的长度,找出区间最长的那个,就是最长算术子数组。

image.png

code

#include<iostream>
using namespace std;
const int N=2e5+10;
int n,t;
int a[N],d[N];
void sovel()
{
    cin>>t;
    for(int c=1;c<=t;c++)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            
            //构造差分数组
            d[i]=a[i]-a[i-1];
        }
        
        d[1]=0;     //第一项设为0
        
        int l=1,r=1,ans=0;
        
        while(r<=n)
        {
            if(d[l]!=d[r])  //说明一个区间已经遍历完了,那就求一下这个区间的长度
            {
                ans=max(ans,r-l+1);
                //cout<<"ans: "<<ans<<endl;
                l=r;  //更新左端点
            }
            r++;
        }
        ans=max(ans,r-l+1);
        
        //cout<<"ans ans: "<<ans<<endl;
    printf("Case #%d: %d\n",c,ans); 
    }
 
}
int main()
{
  
       sovel();

    return 0;
}