IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【双指针模板】 -> 正文阅读

[数据结构与算法]【双指针模板】

有时在一个序列上,二段边界会和左边界同向移动,这时可以用双指针来降低一个 log 的时间复杂度。

模板分为两种:

  1. 寻找最右 / 最左二段边界
  2. 寻找等于某数值的区间

按边界左是 0 还是 1 分类:

  • 寻找 11110000 的最右的一个 1
  • 寻找 00001111 的最右的一个 0

按两指针是否能重合 : 1. 不可重合 2. 可重合

在实现上的细节:假设序列范围是 [1,n]

  • 如果能重合,i = 1 -> n,if(i == j) j ++ ;要放到循环最后
  • 如果不能重合,i = 1 -> n-1,为 j 腾出位置,if(i == j) j ++ ;要放到循环最前

如果不存在有效区间,要注意防止 j 的回退。

模板:

寻找最右的 1

    for(int i = 1, j = 1; i <= n;  i ++ ) // 可重合, 11110000
    {
        while(j <= n && check(i, j)) j ++ ; if(i != j) j -- ;
        if(check(i, j)) ans += j - i + 1;
        if(i == j) j ++ ;
    }

寻找最右的 0

    for(int i = 1, j = 1; i < n;  i ++ ) // 不可重合, 00001111
    {
        if(i == j) j ++ ;
        while(j <= n && check(i, j) == 0) j ++ ; if(i + 1 != j) j -- ;
        if(check(i, j)) ans += j - i + 1;
    }

同理,如果要找最左的 1 或最左的 0,不用让 j 回退即可。注意特判越界的情况,要改为 if(j == n + 1) j -- ;


应用:在一个非严格递增(非严格递减同理)离散序列中,找到对应值的区间的左右端点。

举例:问一个序列中有多少个子序列满足和刚好等于 k 。

模板:固定左端点,右移两个右端点,要找到右端点的有效区间,则找到第一个 a j 1 ≥ k a_{j_1}≥k aj1??k a j 2 ≥ k + 1 a_{j_2}≥k+1 aj2??k+1 的区间, 即 [ j 1 , j 2 ) [j1, j2) [j1,j2) 为所求。注意要排除不存在有效区间的情况,即 j 1 > n j1 > n j1>n.

    for(int i = 1, j1 = 1, j2 = 1; i <= n; i ++ )
    {
        while(j1 <= n && query(i, j1) < k) j1 ++ ;
        while(j2 <= n && query(i, j2) <= k) j2 ++ ;
        if(j1 <= n) ans += j2 - j1;
        if(j1 == i) j1 ++ ;
        if(j2 == i) j2 ++ ;
    }

注: q u e r y ( i , j ) query(i,j) query(i,j) 表示 ∑ k = i j a k \sum_{k=i}^{j}{a_k} k=ij?ak?
题目:小y的序列


最长连续不重复子序列AC代码
dd爱框框AC代码
Xor Sum 2AC代码

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 11:02:06  更:2022-02-27 11:03:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:39:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码