双指针算法快速入门

双指针算法是一种广泛被应用的算法,比如快速排序算法和快速选择算法就是双指针算法的典型应用。双指针算法可以简化朴素算法,即暴力枚举法,基本上所有可以使用暴力法解决的问题都可以使用双指针算法解决。

基本思路为:设置双指针,每次移动表示结尾的指针,将表示区间开始范围的指针缓慢根据情况移动,算法的时间复杂度降为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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值