差分思想
差分数组村每个区间的差值。当差值不一样的时候说明不在一个区间了,这个时候比较每个区间的长度,找出区间最长的那个,就是最长算术子数组。
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;
}