思路

双指针算法在于优化,当发现时间复杂度过高时可以考虑双指针优化

要求:

  • 变化单调 即遍历时,一个边界往某个方向变化,另一个边界只往一个方向变化,而不是自由变化。

例如:当右边界逐渐靠右,假设范围大小有限制,随着右边不断变大,发现左右边界的范围超过要求的范围了,左边界只能向右移动来满足要求,这样就是单调变化。

实现

int l = 0, r = 0;
for(r = 0; r < n; r ++)
{
	//statement
	while(r - l > k)
	{
		l ++;
	}
	//statement
}

这样将原本可以两维变化(左右都动)的问题简化为一维,优化时间复杂度

具体例子

#include <iostream>
#include <algorithm>
 
using namespace std;
 
const int N = 1e5 + 10;
 
int n;
int a[N];
int r[N];
 
int
main()
{
    cin >> n;
    for(int i = 0; i < n; i ++)
    {
        cin >> a[i];
    }
    
    int i = 0, j = 0; 
    int ans = 0;
    
    for(i = 0; i < n; i ++)
    {
        r[a[i]] ++;
        while(r[a[i]] > 1)
        {
            r[a[j]] --;
            j ++;
        }
        ans = max(ans, i - j + 1);
    }
    
    cout << ans << endl;
    
    return 0;
}