算法基础-双指针算法

最长连续不重复子序列

  1. 双指针j, i维护的是以ai结尾的最长连续不重复子序列
  2. j, i - 1是前一步得到的最长连续不重复子序列,所以如果j, i中有重复元素,一定是ai,所以j, i - 1中一定有一个数字与ai重复,因此右移j直到ai不重复(通过次数来判断)为止
  3. 数组s记录子序列aj \~ i中各元素出现次数

i移动到第二个9,次数为2,j 减去1 并且右移1位到3
i移动到第二个3,次数为2,j减去1并且右移1位到6

每次都是先减去1再右移,保证每个数字不重复

java 复制代码
public class Main {
    public static void main(String[] args) {
        int[] a = new int[1000001];
        int[] s = new int[1000001];
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for(int i = 0; i < n; i ++)
            a[i] = in.nextInt();
        int res = 0;
        for(int i = 0, j = 0; i < n; i ++) {
            s[a[i]] ++;
            while(s[a[i]] > 1) {
                s[a[j]] --;
                j ++;
            }
            res = Math.max(res, i - j + 1);
        }
        System.out.println(res);
    }
}

数组元素的目标和

a数组选的值越大,那么b数组选的值越小,x是固定的

java 复制代码
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int x = in.nextInt();
        int[] a = new int[n + 10];
        int[] b = new int[m + 10];
        for(int i = 0; i < n; i ++)
            a[i] = in.nextInt();
        for(int i = 0; i < m; i ++)
            b[i] = in.nextInt();
        for(int i = 0, j = m - 1; i < n; i ++) {
            while(a[i] + b[j] > x && j >= 0)
                j --;
            if(a[i] + b[j] == x && j >= 0) {
                System.out.println(i + " " + j);
                break;
            }
        }
    }
}

判断子序列

只需要找到一种情况即可
j 完全遍历一遍,找到的话 i 就往后移动一位,如果 i == n 说明全部找到

java 复制代码
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] a = new int[n + 10];
        int[] b = new int[m + 10];
        for(int i = 0; i < n; i ++)
            a[i] = in.nextInt();
        for(int i = 0; i < m; i ++)
            b[i] = in.nextInt();
        int i = 0, j = 0;
        while(i < n && j < m) {
            if(a[i] == b[j])
                i ++;
            j ++;
        }
        if(i == n)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
相关推荐
霸道流氓气质12 分钟前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..17 分钟前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
洋不写bug19 分钟前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
residual_fan20 分钟前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
后台模板学习22 分钟前
用 IM 即时聊天项目一次讲清消息去重算法的踩坑与解决方案
java·数据库·spring
秋名RG24 分钟前
2026/6/15 系统故障复盘与整改方案
java·架构
今天要早睡_27 分钟前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
南讯股份Nascent30 分钟前
2026年CRM技术选型观察:当“数据打通“成为第一需求,电商CRM的架构价值在哪里
java·大数据·用户运营
心易行者35 分钟前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
s_w.h36 分钟前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash