双指针算法引入:
双指针算法是一种常见的优化技巧,其算法的时间复杂度通常为O(n),在一些特定的问题中,可以通过使用双指针算法来优化算法的时间复杂度。
常见问题分类:
(1) 对于一个序列,用两个指针维护一段区间
(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
算法模板:
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具体问题的逻辑
}
例题解析:
双指针思路:定义 i,j 两个指针,不断维护使得区间内不会重复。
完整代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int a[maxn], b[maxn], n, ret = 0;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0, j = 0; i < n; i++) {
b[a[i]]++;
while (b[a[i]] > 1) {
b[a[j]]--;
j++;
} //出现重复,j右移直到不包含重复
ret = max(i - j + 1, ret);
}
cout << ret;
return 0;
}
洛谷练习题:
P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)