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;
}
相关推荐
团子的二进制世界几秒前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc4 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
吃杠碰小鸡4 分钟前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨4 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long3165 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
近津薪荼6 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
熊文豪14 分钟前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
熊猫_豆豆31 分钟前
YOLOP车道检测
人工智能·python·算法
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day1 小时前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养