码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-29 19:51:43      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:十分   div   style   转换   int   str   names   code   image   

双指针算法本质上就是将具有单调性的算法复杂度为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\n",res);
        
    return 0;
}

 

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

标签:十分   div   style   转换   int   str   names   code   image   

原文地址:https://www.cnblogs.com/Flydoggie/p/12240889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!