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

双指针算法

代码模板

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;
}
相关推荐
bkspiderx9 小时前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境
东华万里9 小时前
第40篇C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·面试·大学生专区
雪的季节9 小时前
OPENCV学习(补充1)
人工智能·opencv·学习
luj_17689 小时前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场9 小时前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
东华万里9 小时前
第40篇 C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·大学生专区
AC赳赳老秦9 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw
玩三国杀玩的10 小时前
Pytorch-c++-CUDA
c++·pytorch·python·深度学习
马可家的菠萝10 小时前
Vue3 + Canvas 手绘笔记工程化实践:别把画布只当成一张 PNG
前端·vue.js·算法
watersink10 小时前
机器学习极大似然估计与EM算法
人工智能·算法·机器学习