算法基础-双指针算法

最长连续不重复子序列

  1. 双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列
  2. [j, i - 1]是前一步得到的最长连续不重复子序列,所以如果[j, i]中有重复元素,一定是a[i],所以[j, i - 1]中一定有一个数字与a[i]重复,因此右移j直到a[i]不重复(通过次数来判断)为止
  3. 数组s记录子序列a[j ~ 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");
    }
}
相关推荐
黎雁·泠崖7 分钟前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言
uesowys8 分钟前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
季明洵34 分钟前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi39 分钟前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL39 分钟前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao40 分钟前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
怒放吧德德41 分钟前
后端 Mock 实战:Spring Boot 3 实现入站 & 出站接口模拟
java·后端·设计
only-qi43 分钟前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250144 分钟前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-1 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法