(Acwing)4974. 最长连续子序列

给定一个整数序列,其中任意两个相邻元素之差的绝对值不超过1,求满足最大元素与最小元素之差不超过1的最长连续子序列的长度。使用双指针算法,维护元素个数和最大值,当元素超过2个时移动指针,更新最长子序列长度。
摘要由CSDN通过智能技术生成

给定一个长度为 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; 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值