算法基础学习|双指针算法

双指针算法

代码模板

cpp 复制代码
for (int i = 0, j = 0; i < n; i ++ ){
    while (j < i && check(i, j)) j ++ ;

    // 具体问题的逻辑
}
常见问题分类:
    (1) 对于一个序列,用两个指针维护一段区间
    (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

例题一:最长连续不重复子序列

题目

给定一个长度为 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入格式

第一行包含整数 。

第二行包含 个整数(均在 范围内),表示整数序列。

输出格式

共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

数据范围

输入样例

cpp 复制代码
5
1 2 2 3 5

输出样例

cpp 复制代码
3

代码示例

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 100010;

int a[N], s[N];

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];

    //双指针运算
    int res = 0;
    for(int i = 0, j = 0; i < n; i++){
        s[a[i]]++;
        while(j < i && s[a[i]] > 1) s[a[j++]]--;//先--后++
        res = max(res, i - j + 1);
    }

    cout << res << endl;
}

例题二:数组元素的目标和

题目

给定两个升序排序的有序数组 和 ,以及一个目标值 。

数组下标从 0 开始。

请你求出满足 的数对 。

数据保证有唯一解。

输入格式

第一行包含三个整数 ,分别表示 的长度, 的长度以及目标值 。

第二行包含 个整数,表示数组 。

第三行包含 个整数,表示数组 。

输出格式

共一行,包含两个整数 和 。

数据范围

数组长度不超过 。

同一数组内元素各不相同。
数组元素

输入样例

cpp 复制代码
4 5 6
1 2 4 7
3 4 6 8 9

输出样例

cpp 复制代码
1 1

代码示例

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 100010;

int a[N], b[N];

int main() {
    int n, m, x;
    cin >> n >> m >> x;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    for (int i = 0, j = m - 1; i < n; i++){
        while (j >= 0 && a[i] + b[j] > x) j--;//时间复杂度为O(m+n)
        if (j >= 0 && a[i] + b[j] == x) cout << i << ' ' << j << endl;
    }

}

例题三:判断子序列

题目

给定一个长度为 的整数序列 以及一个长度为 的整数序列 。

请你判断 序列是否为 序列的子序列。

子序列指序列的一部分项按原有次序排列 而得的序列,例如序列 是序列 的一个子序列。

输入格式

第一行包含两个整数 。

第二行包含 个整数,表示 。

第三行包含 个整数,表示 。

输出格式

如果 序列是 序列的子序列,输出一行 Yes。

否则,输出 No。

数据范围

,

输入样例

cpp 复制代码
3 5
1 3 5
1 2 3 4 5

输出样例

cpp 复制代码
Yes

代码示例

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 100010;

int a[N], b[N];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    int i = 0, j = 0; 
    while(i < n && j < m){
        if(a[i] == b[j]) i++;
        j++;
    }
    if(i == n) cout << "Yes" << endl;
    else cout << "No" << endl;
}
相关推荐
king135987455014 分钟前
LiteRT Tensor API:C++ 编写端侧模型图,XNNPACK、GPU 与 NPU 怎么选?
开发语言·c++·人工智能·chatgpt·架构·aigc
尹玉玺24 分钟前
从原子残片到天道公理:以德谟克利特思想全貌,重新定界西方唯物认知的历史层级与边界
人工智能·算法·架构
青少儿编程课堂25 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
m0_6464299729 分钟前
BCrypt 与 JWT 认证流程学习笔记
笔记·学习
apple_6926588533 分钟前
QX 效率启动器安装包:开源生产力工具,快捷键统一入口Raycast免费开源平替版来啦
学习·开源·办公
重生之小比特37 分钟前
【算法拾光】二分查找|二分查找 + 再排序数组中查找元素的第一个和最后一个位置
算法·leetcode·职场和发展
纪念 22938 分钟前
C++ list讲解
c++·windows·list
一直C1 小时前
嵌入式 Linux 驱动开发学习笔记:中断、等待队列与工作队列
linux·驱动开发·嵌入式硬件·学习·imx6ull
零基础1231 小时前
基于模型的强化学习与不基于模型的强化学习:核心区别与实战选择
python·算法
我命由我123451 小时前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法