基础双指针算法:单队列、双队列
1、单队列
例1:将字符串以换行符间隔开
输入一串字符串,字符串有多个由单个逗号隔开的单词,
任务是需要把单词间隔开,每个单词换行输出。
输入样例
abc def ghi
输出样例
abc
def
ghi
#include <iostream> using namespace std; const int N = 1010; int main() { char str[N]; #define gets(str) gets_s(str) gets(str); int n = strlen(str); for (int i = 0, j = 0; i < n;) { while (j < n && str[j] != ' ') j++; for (int k = i; k < j; k++) { cout << str[k]; } cout << endl; i = j + 1; j++; } return 0; }
例2:以AcWing.799为例,题目要求如下:
题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤100000,
输入样例
5
1 2 2 3 5
输出样例
3
#include <iostream> using namespace std; const int N = 1e5 + 10; int q[N], s[N]; int main() { int n, ans = 0; cin >> n; for (int i = 0; i < n; i++) scanf("%d", &q[i]); for (int i = 0, j = 0; i < n; i++) { s[q[i]]++; while (j <= i && s[q[i]] > 1) { s[q[j]]--; j++; } ans = max(ans, i - j + 1); } cout << ans << endl; return 0; }
2、双队列:略,可参考归并排序

浙公网安备 33010602011771号