双指针
作者:
巷港
,
2022-03-12 23:26:23
,
所有人可见
,
阅读 216
双指针应用场景
1、位于两个不同序列的指针,如归并排序的最后一步
2、位于同一一个序列的两个指针,如快速排序的思路
最简单的应用(输出字符串中的单词,单词与单词之间以空格隔开)
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
for (int i=0;s[i];i++)
{
int j=i;
while (j<s.size()&&s[j]!=' ') j++;
for (int k=i;k<j;k++) cout<<s[k]<<' ';
cout<<endl;
i=j;
}
return 0;
}
最长连续不重复子序列
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100010;
int a[N],s[N]; //s[N]表示区间内每个数的出现次数
int n;
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
int ans=0;
for (int i=0,j=0;i<n;i++)
{
s[a[i]]++; //每次新增加一个数
while (j<=i&&s[a[i]]>1) //如果现在发现区间内有重复的数字,那一定是刚加入的那个数
{
s[a[j]]--; //此时因为区间内出现了重复的元素,需要逐一排查
j++; //排查一次的结果,要么正好去掉了重复元素,要么还是没去掉
}
ans=max(ans,i-j+1); //此时区间内没有重复的元素了,就更新一下答案
}
printf("%d\n",ans);
return 0;
}