栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【模板题】双指针算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【模板题】双指针算法

一、AcWing 799. 最长连续不重复子序列

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

【输入格式】
第一行包含整数 n n n。
第二行包含 n n n个整数(均在 0 ∼ 1 0 5 0sim 10^5 0∼105范围内),表示整数序列。

【输出格式】
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

【数据范围】
1 ≤ n ≤ 1 0 5 1≤n≤10^5 1≤n≤105

【输入样例】

5
1 2 2 3 5

【输出样例】

3

【代码】

#include 
using namespace std;

const int N = 100010;
int a[N], s[N];//数组s记录每个数出现的次数
int n;

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    int res = 0;
    for (int i = 0, j = 0; i < n; i++)
    {
        s[a[i]]++;
        //不断移除左端点的数直到[j,i]内没有重复元素为止
        while (s[a[i]] > 1)
        {
            s[a[j]]--;
            j++;
        }
        res = max(res, i - j + 1);
    }
    printf("%dn", res);
    return 0;
}
二、AcWing 800. 数组元素的目标和

【题目描述】
给定两个升序排序的有序数组 A A A和 B B B,以及一个目标值 x x x。
数组下标从 0 0 0开始。
请你求出满足 A [ i ] + B [ j ] = x A[i]+B[j]=x A[i]+B[j]=x的数对 ( i , j ) (i,j) (i,j)。
数据保证有唯一解。

【输入格式】
第一行包含三个整数 n , m , x n,m,x n,m,x,分别表示 A A A的长度, B B B的长度以及目标值 x x x。
第二行包含 n n n个整数,表示数组 A A A。
第三行包含 m m m个整数,表示数组 B B B。

【输出格式】
共一行,包含两个整数 i i i和 j j j。

【数据范围】
数组长度不超过 1 0 5 10^5 105。
同一数组内元素各不相同。
1 ≤ 数 组 元 素 ≤ 1 0 9 1≤数组元素≤10^9 1≤数组元素≤109

【输入样例】

4 5 6
1 2 4 7
3 4 6 8 9

【输出样例】

1 1

【代码】

#include 
using namespace std;

const int N = 100010;
int a[N], b[N];
int n, m, x;

int main()
{
    scanf("%d%d%d", &n, &m, &x);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    for (int i = 0; i < m; i++) scanf("%d", &b[i]);
    for (int i = 0, j = m - 1; i < n; i++)
    {
        while (j >= 0 && a[i] + b[j] > x) j--;
        if (a[i] + b[j] == x)
        {
            printf("%d %dn", i, j);
            break;
        }
    }
    return 0;
}
三、AcWing 2816. 判断子序列

【题目描述】
给定一个长度为 n n n的整数序列 a 1 , a 2 , … , a n a_1,a_2,dots ,a_n a1​,a2​,…,an​以及一个长度为 m m m的整数序列 b 1 , b 2 , … , b m b_1,b_2,dots ,b_m b1​,b2​,…,bm​。
请你判断 a a a序列是否为 b b b序列的子序列。
子序列指序列的一部分项按原有次序排列而得的序列,例如序列 { a 1 , a 3 , a 5 } left{ a_1,a_3,a_5right} {a1​,a3​,a5​}是序列 { a 1 , a 2 , a 3 , a 4 , a 5 } left{ a_1,a_2,a_3,a_4,a_5right} {a1​,a2​,a3​,a4​,a5​}的一个子序列。

【输入格式】
第一行包含两个整数 n , m n,m n,m。
第二行包含 n n n个整数,表示 a 1 , a 2 , … , a n a_1,a_2,dots ,a_n a1​,a2​,…,an​。
第三行包含 m m m个整数,表示 b 1 , b 2 , … , b m b_1,b_2,dots ,b_m b1​,b2​,…,bm​。

【输出格式】
如果 a a a序列是 b b b序列的子序列,输出一行Yes。
否则,输出No。

【数据范围】
1 ≤ n ≤ m ≤ 1 0 5 1≤n≤m≤10^5 1≤n≤m≤105
− 1 0 9 ≤ a i , b i ≤ 1 0 9 −10^9≤a_i,b_i≤10^9 −109≤ai​,bi​≤109

【输入样例】

3 5
1 3 5
1 2 3 4 5

【输出样例】

Yes

【代码】

#include 
#include 
using namespace std;

const int N = 100010;
int a[N], b[N];
int n, m;

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    for (int i = 0; i < m; i++) scanf("%d", &b[i]);
    int i = 0, j = 0;
    while (i < n && j < m)
    {
        if (a[i] == b[j]) i++;
        j++;
    }
    if (i == n) puts("Yes");
    else puts("No");
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号