双指针算法

Posted by 磊落 on May 11, 2020

双指针算法

思想

双指针算法都是把暴力算法写出来,然后看有没有单调性,如果有单调性就可以把时间复杂度降低
两个指针移动将O(n ^ 2)的算法优化成O(n)   

特点

*模板

```
    for (int i = 0; i < n; i++)
        while (i < j && check(i, j)) j ++;
```    
// 找出连续数字最长的长度
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
int n;
int a[N], s[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    int res = 0;
    
    for (int i = 0, j = 0; i < n; i++)
    {
        s[a[i]] ++;
        while (s[a[i]] > 1)
        {
            s[a[j]] -- ;  //关键一步 将记录在s数组中的数字弹出,这样就可以往后遍历的时候,在遇到相同的数字不至于被算作重复的。
            j ++;
        }
        
        res = max(res, i - j + 1);
    }
    
    cout << res << endl;
    
    return 0;
}