双指针一般应用于维护两个队列,或者同一队列。
常见写法如下
for (int i = 0, j = 0; i < n; i++){while (j < i && check(i, j)) j++;//每道题的具体逻辑}
双指针的核心思想是把如下O(n^2)的算法优化位O(n)
for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){//-----------}}
实例:给定一个字符串abc def ghe,输出字符串的每个字串
#include<iostream>
#include<string.h>
using namespace std;int main()
{char str[1000];gets(str);int n = strlen(str);for (int i = 0; i < n; i++){//维护大区间内到某一段小区间int j = i;while (j < n && str[j] != ' ')j++; //j此时指向空格//具体题目逻辑for (int k = i; k < j; k++)cout << str[k];cout << endl;//记录最新位置i = j;}return 0;
}
最长连续不重复子序列
给定一个长度为 nn 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
#include <iostream>using namespace std;const int N = 100010;int n;
int q[N], s[N];int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);int res = 0;//使用i j 维护一段区间,确保此区间内无重复元素。如果发现重复元素,通过移移动j来剔除重复元素,//i j是单调的for (int i = 0, j = 0; i < n; i ++ ){s[q[i]] ++ ;while (j < i && s[q[i]] > 1) s[q[j ++ ]] -- ;res = max(res, i - j + 1);}cout << res << endl;return 0;
}