AcWing学习——双指针算法

1. 概念

双指针通过两个指针以不同速度和条件来遍历某个区间,在遍历期间能够找到符合特定条件的元素或者子区间。

2. 思路

一般的双指针算法 都存在一个暴力算法 ,即O(n^2)时间复杂度 的算法,我们可以观察暴力算法的两次循环是否存在某种单调关系,如果存在可以通过双指针进行优化成为O(n)的时间复杂度

我们首先定义右指针r左指针l,每当右指针r向后移动的时候,都去判断左指针l所能达到的最左端。同时需要注意的是,r指针l指针都只会向后移动,不可能出现r指针后移,l指针左移的情况。

假设2-4范围是当前符合条件的区间,如果1-5也是符合条件的区间,那么1-4也是符合条件的区间,那么假设失败。

常见的滑动窗口问题 ,我们可以通过定义两个指针,分别表示窗口的左端和右端,通过移动左、右端下标来对窗口进行移动,需要注意的是,左端下标一定小于等于右端下标。

3. 代码模板

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

4. 注意点

常见问题分类

  1. 对于一个序列,用两个指针维护一段区间
  2. 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

5. 例题

5.1. 最长连续不重复子序列 - AcWing题库

c++ 复制代码
#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;
}
相关推荐
地平线开发者25 分钟前
Transformer模型部署之性能优化指南
算法
地平线开发者1 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月4 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星5 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星5 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC20 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与1 天前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
博客18001 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴1 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake