ACM算法训练【双指针算法合集】

简介: 思路:找到i,j的单调性,统一向后移动,使时间复杂度为O(2n)枚举i,每次看j是否需要向后走,得到最长的长度


1.最长连续不重复子序列


25b28d9feb2e409786084adf0b724b93.png


思路:


找到i,j的单调性,统一向后移动,使时间复杂度为O(2n)
枚举i,每次看j是否需要向后走,得到最长的长度


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],flag[N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int ans=0;
    for(int i=0,j=0;i<n;i++)
    {
        flag[a[i]]++;
        while(flag[a[i]]>1)
        {
            flag[a[j]] --;
            j++;
        }
        ans=max(ans,i-j+1);
    }
    cout<<ans;
    return 0;
}


2.数组元素的目标和


279fabedc5114fafb497a56a7b74a1a0.png


输入样例:


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


输出样例:


1 1


思路:


双指针算法对于朴素做法的优化:

寻找单调性

i从 0开始 从前往后遍历

j从 m - 1开始 从后向前遍历

对于每个i,找到一个j,使得a[i]+b[j]>x,且j最靠左


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],b[N];
int n,m,x;
int main()
{
    cin>>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)
        {
            cout<<i<<' '<<j;
            break;
        }
    }
    return 0;
}


3.判断子序列


给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。


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


子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。


输入格式


第一行包含两个整数 n,m。


第二行包含 n 个整数,表示 a1,a2,…,an。


第三行包含 m 个整数,表示 b1,b2,…,bm。


输出格式


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

否则,输出 No。


c9998c5c4c2f4a719fce39d391dcb818.png


输入样例:


3 5
1 3 5
1 2 3 4 5


输出样例:


Yes


思路:


遍历b数组,在a数组中指针找到匹配的数字, 如果a数组全部匹配成功,则输出Yes,否则输出No

代码:


#include <bits/stdc++.h>
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++)
        scanf("%d",&a[i]);
    for(int j=0;j<m;j++)
        scanf("%d",&b[j]);
    int i=0;
    for(int j=0;j<m;j++)
    {
        if(i>=n) break;
        if(a[i]==b[j]) i++;
    }
    if(i==n) cout<<"Yes";
    else cout<<"No";
    return 0;
}


目录
相关文章
|
20天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
36 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
25天前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
27天前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
2月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
46 4
双指针算法详解
|
27天前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
27天前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
28天前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
3月前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
3月前
|
算法 容器
【算法】双指针
【算法】双指针

热门文章

最新文章