给定一个长度为 n
的整数序列 a1,a2,…,an。
给定序列满足,任意两个相邻元素之差的绝对值不超过 1,即对于每个 1≤i<n,保证 |ai+1−ai|≤1。
请你找到给定序列的一个尽可能长的连续子序列,要求该连续子序列应满足其中的最大元素与最小元素之差不超过 1。
输出满足条件的最长连续子序列的长度。
输入格式
第一行包含整数 n。
第二行包含 n
个整数 a1,a2,…,an。
输出格式
一个整数,表示满足条件的最长连续子序列的长度。
数据范围
前 6个测试点满足 2≤n≤20。
所有测试点满足 2≤n≤105,1≤ai≤105。
输入样例1:
5
1 2 3 3 2
输出样例1:
4
输入样例2:
11
5 4 5 5 6 7 8 8 8 7 6
输出样例2:
5
解题思路
子串必须满足最大值与最小值的差不大于一,推导可得子串内的元素只能由两个数字组成,
因此利用双指针算法,设两个数组一个存数,另一个记录i到j区间内元素的个数,再设一个变量
记录i到j的最大值,如果i到j内的元素超过三个,就开始移动j指针,一直到区间内的元素个数再
次为2时停止。
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
int w[N],cnt[N]; //cnt记录每个元素出现的次数
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>w[i];
int res=0;
for(int i=0,j=0,s=0;i<n;i++){ //s记录元素出现的次数
if(!cnt[w[i]])s++;
cnt[w[i]]++;
while(s>2){ //如果子区间内元素个数超过2个时就移动J指针直到区间内元素为2再停止
cnt[w[j]]--;
if(!cnt[w[j]])s--;
j++;
}
res=max(res,i-j+1); //res记录最大区间值
}
cout<<res<<endl;
return 0;
}