首页 > 编程语言 >双指针算法总结

双指针算法总结

时间:2023-11-30 22:33:06浏览次数:31  
标签:总结 int scanf while ++ 算法 序列 指针

双指针算法分为两类:第一类指向一个序列(更多的情况),第二类指向两个序列。

基本的代码框架是:

for (i = 0, j = 0; i < n; i++)
{
    while (j < i && check(i, j)) j++;
    
    // 每道题目的具体逻辑
}

核心思想:运用单调性等性质,将O(n2)的算法优化到O(n)。

种类:快排的划分、归并排序的归并、KMP算法等。

 

第一类:指向一个序列

题目链接:

https://www.acwing.com/problem/content/801/

题解:

遍历区间,对于每一个i,找到最左边的j,使得[j, i]区间中的数不包含重复元素。满足单调性,可以使用双指针算法。

代码:

#include <iostream>

using namespace std;

const int N = 100010;

int n;
int a[N], s[N];

int main()
{
    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 (s[a[i]] > 1)
        {
            s[a[j]]--;
            j++;
        }
        
        res = max(res, i - j + 1);
    }
    
    cout << res << endl;
    
    return 0;
}

 

第二类:指向两个序列

题目链接:

https://www.acwing.com/problem/content/802/

题解:

对于有序数组中的每一个数A[i],在B数组中找到最左边的数B[j],使得A[i] + B[j] >= x。基于这一思想,i从1到n遍历,j从m - 1到0遍历,利用单调性,使用双指针算法,找到第一个满足条件A[i] + B[j] == x的数对即可。

代码:

#include <iostream>

using namespace std;

const int N = 100010;

int n, m, x;
int a[N], b[N];

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 %d\n", i, j);
            break;
        }
    }
    
    return 0;
}

补充题目链接:

https://www.acwing.com/problem/content/2818/

题解:

从左到右遍历a序列,从b序列中找到与a序列相等的数字,找到所有a序列的匹配,则可以输出Yes,否则输出No。

代码:

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], b[N];

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;
}

 

标签:总结,int,scanf,while,++,算法,序列,指针
From: https://www.cnblogs.com/ykycode/p/17868559.html

相关文章

  • 每日总结11.30
    访问者模式1、理解访问者模式的动机,掌握该模式的结构;2、能够利用访问者模式法解决实际问题。实验任务:打包员在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。Client.javapublicclassClient{publicstaticvoidmain(String[]args......
  • 机器学习中的典型算法——卷积神经网络(CNN)
    1.机器学习的定位AI,是我们当今这个时代的热门话题,那AI到底是啥?通过翻译可知:人工智能,而人工智能的四个核心要素:-数据-算法-算力-场景然后机器学习是人工智能的一部分,机器学习里面又有新的特例:深度学习。通俗来说机器学习即使用机器去学习一部分数据,然后去预测新的数据所属......
  • 刚硬矩阵 (2) Walsh–Hadamard 变换的 "更快" 算法
    \(\newcommand{\sfT}{\mathsfT}\newcommand{\rank}{\operatorname{rank}}\)为了避免歧义,我们这里约定\[H=\begin{bmatrix}1&1\\1&-1\end{bmatrix},\]以及\(2^n\times2^n\)的Hadamard矩阵写作\(H^{\otimesn}\).令\(N=2^n\).低深度电路的算法这里我们......
  • 文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题
    一、用go语言,假设一棵二叉搜索树中的结点在1到1000之间,现在想要查找数值为363的结点。下面序列中哪个不是查找过的序列?a.2,252,401,398,330,344,397,363。b.924,220,911,244,898,258,362,363。c.925,202,911,240,912,245,363。d.2,399,387,219,266,382,381,278,363。e.935,278,347,621,299,392,358,363。灵捷3......
  • 文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题
    一、用go语言,假设一棵二叉搜索树中的结点在1到1000之间,现在想要查找数值为363的结点。下面序列中哪个不是查找过的序列?a.2,252,401,398,330,344,397,363。b.924,220,911,244,898,258,362,363。c.925,202,911,240,912,245,363。d.2,399,387,219,266,382,381,278,363。e.935,278,347,621,299,392,358,363。灵......
  • 11.30每日总结
    实验一:百度机器翻译SDK实验一、实验要求 任务一:下载配置百度翻译Java相关库及环境(占10%)。 任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。 任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。......
  • 面试题总结
    1、通信协议通信协议通常使用分层架构来组织和管理通信过程。常见的分层架构包括以下几层:物理层:物理层负责处理物理媒介上的信号传输,如电缆、光缆、无线信号等。数据链路层:数据链路层负责将物理层传来的信号转换为数据帧,并在相邻节点之间进行数据传输。网络层:网络层负责......
  • 基于FPGA的图像白平衡算法实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览    2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述       FPGA(Field-ProgrammableGateArray)是一种可编程逻辑电路,可以通过编程实现各种算法,包括图像白平衡算法。图像白平衡算法是一种用于调整图像颜色温度的方法,......
  • 垃圾收集算法
    垃圾收集算法在Java内存运行时区域中,堆和方法区有着显著的不确定性:接口的多个实现类需要的内存可能不同方法执行中不同条件需要的内存空间也不同这部分内存的分配和回收是动态的。两个问题,回收谁、怎么回收回收谁——可回收垃圾(算法)当对象没有被任何地方引用时,显然是可回......
  • 基于MUSIC算法的二维超声波成像matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      MUSIC(MultipleSignalClassification)算法是一种广泛应用于信号处理领域的算法,它可以用于估计信号的波达方向或频率。在超声波成像中,MUSIC算法可以用于提高图像的分辨率和降低......