算法学习——双指针算法(最长连续不重复子序列)

Posted flydoggie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习——双指针算法(最长连续不重复子序列)相关的知识,希望对你有一定的参考价值。

双指针算法本质上就是将具有单调性的算法复杂度为O(N^2)的朴素算法通过双指针优化到O(n)的一种优化方法。是一种十分常用的算法。

设计双指针算法我们一般先写出它的朴素算法,然后按照模板:

 

for( int i = 0, j = 0 ; i < n ; i ++) {

  //check()是按照题目逻辑的判断函数

  while( j <= i && check() ){

    //不满足时
    j ++;
  }

  //此处是按照题目逻辑的解答过程。

}

将其转换为双指针算法。

例题:最长连续不重复子序列

技术图片

 

 题解代码:

#include<iostream>
using namespace std;

const int N = 1000010;

int n;
int a[N];
int cnt[N];


int main(){
    
    int res = 0;
    scanf("%d",&n);
    for(int i = 0 ; i < n ; i ++ ) scanf("%d",&a[i]);
    
    for(int i = 0, j = 0 ; i < n ; i ++ ){
        cnt[a[i]]++;
        
        while( cnt[a[i]] > 1 ){
            cnt[a[j]]--;
            j++;
        }
        
        res = max(res , i - j + 1);
    }
    printf("%d
",res);
        
    return 0;
}

 

以上是关于算法学习——双指针算法(最长连续不重复子序列)的主要内容,如果未能解决你的问题,请参考以下文章

15.最长连续不重复子序列

双指针

ACWing 最长连续不重复子序列(双指针)

双指针—最长连续不重复子序列

算法 ---- 子序列系列问题题解(子序列编辑距离回文系列问题)

算法 ---- 子序列系列问题题解(子序列编辑距离回文系列问题)