双指针专题2:最长连号
描述
输入长度为n的一个正整数序列,要求输出序列中最长连号的长度连号指在序列中,从小到大的连续自然数
输入描述
第一行,一个整数n。
第二行,n个整数ai,之间用空格隔开
输出描述
一个数,最长连号的个数
实际上可以利用动态规划:
#include <bits/stdc++.h>
using namespace std;
struct node{
int num,sum;
}a[10010];
bool cmp(node a,node b){
return a.sum<b.sum;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].num;
a[i].sum=1;
}
for(int i=2;i<=n;i++){
if(a[i].num==a[i-1].num+1){
a[i].sum=a[i-1].sum+1;
}
}
sort(a+1,a+n+1,cmp);
cout<<a[n].sum;
}
但用双指针更加方便:
#include <bits/stdc++.h>
using namespace std;
int a[10010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
int r=1,l=1;//注意从0开始还是1开始
while(r<=n){//个人建议直接while循环嵌套,不用for
if(a[r]!=a[r-1]+1){
l=r;
}
int cnt=r-l+1;
ans=max(ans,cnt);
r++;
}
cout<<ans;
return 0;
}