算法学习之路 双指针算法

/*
双指针算法可以解决像最长不重复子序列一样的问题
思路:先暴力想思路判断check()的条件,再将n^2利用模板优化为n的双指针算法;
总思路模板:
 
    for(int i = 1,j = 1;i < n;i++)
    {
        while(j < i && check())
        {
            j++;
            s[a[i]]--;
        }
        res = max(res , i - j + 1);
    }
*/
//处理最长不重复子序列的双指针算法
 
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int a[N];
int b[N];//注意标记数组的类型要与数组保持一致;
int main()
{
    int n;
    cin>>n; //数组长度为n
    for(int i = 0;i < n;i++)
    {
        cin>>a[i];
    }
    int res  = 0;
    for(int i = 0,j = 0;i < n;i++)
    {
        b[a[i]]++;
        while(j < i && b[a[i]] > 1)
        {
            b[a[j]]--;
            j++;
        }
        res = max(res , i - j + 1);
    }
    cout<<res;
    system("pause");
    return 0;
}
posted @ 2022-07-29 02:37  硬核小马  阅读(19)  评论(0编辑  收藏  举报