双指针算法是一种广泛被应用的算法,比如快速排序算法和快速选择算法就是双指针算法的典型应用。双指针算法可以简化朴素算法,即暴力枚举法,基本上所有可以使用暴力法解决的问题都可以使用双指针算法解决。
基本思路为:设置双指针,每次移动表示结尾的指针,将表示区间开始范围的指针缓慢根据情况移动,算法的时间复杂度降为On
模板如下:
public static void doublePointer(int n){
for(int i = 0,j = 0; i < n; i++){
while(j < i && check(i)){
j++;
}
// ......
}
}
题目链接如下:活动 - AcWing
给定一个长度为 nn 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 nn。
第二行包含 nn 个整数(均在 0∼1050∼105 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤1051≤n≤105
输入样例:
5
1 2 2 3 5
输出样例:
3
具体思想如下:先循环遍历区间边界,然后判断情况,使得区间范围内不存在重复元素,否则将左指针向前移动,直达区间不存在重复元素,再进行大小比较
代码如下:
package demo1;
import java.util.*;
@SuppressWarnings("all")
public class demo7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//创建数组存储数字序列
int [] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = scanner.nextInt();
}
//进行双指针查找
//存储结果
int res = 0;
//存储已出现的元素标识
int [] brr = new int[100005];
for(int i = 0,j = 0; i < n; i++){
//遍历区间结尾,寻找最大范围
brr[arr[i]]++;
//寻找最小满足其坐标
while(brr[arr[i]] > 1){
brr[arr[j]]--;
j++;
}
//寻找到无重复元素范围后,进行大小比较
res = Math.max(res, i - j + 1);
}
System.out.println(res);
}
}