双指针算法的实现(三题详解)

         这是C++算法基础-基础算法专栏的第十五篇文章,专栏详情请见此处


ps:转眼间暑假已过半,我在这段时间也积累了很多文章,所以到开学(9月1日)为止,每个周我将会在周三和周六发文章(o゚▽゚)o  

引入

        双指针是一种解决问题的一种方法,我们可以在题目中挖掘一些性质,并使用双指针算法优化时间复杂度。

        下面我们就来讲双指针算法的实现。

定义

        双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。

        双指针顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息。

过程

        双指针算法,从名字上就能看出,我们是用两个指针对序列进行操作的,具体有两种分类:

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

        而双指针算法还可以通过问题类型分类,较简单与常见的有三种,接下来我们就用三道题目来详细讲解:

        1. 维护区间信息

        如果不和其他数据结构结合使用,双指针维护区间信息的最简单模式就是维护具有一定单调性,新增和删去一个元素都很方便处理的信息。

        例题:AcWing-799. 最长连续不重复子序列

        题目大意:给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

        具体思路:在一个区间中维护两个指针i,ji遍历每一个位置j记录当前序列起始位置。首先,两个指针从头开始;然后i进行遍历,并开一个额外的数组s记录区间\left [ i,j \right ]每个数字出现的次数(就是开一个桶),每次i移动时,桶内的数加一;然后判断,如果此时当前桶数字大于1,就说明目前r指针所指的位置重复了;这时,记录序列长度,即i-j+1,打擂台求出最大值,然后j数组不断向前移动,将s中存储的数字出现的次数减去1,直到遇到i为止;最后,存储最大值的变量记录的就是最长连续不重复子序列的长度。

        2. 维护有序序列

        很多时候在序列上使用双指针之所以能够正确地达到目的,是因为序列的某些性质,最常见的就是利用序列的有序性。

         例题:AcWing-800. 数组元素的目标和

        题目大意:给定两个升序排序的有序数组AB,以及一个目标值x,求出满足A\left [ i \right ]+B\left [ j \right ]=x的数对\left ( i,j \right )

        具体思路:由于两数之和固定,那么两数之中的小数越大,大数越小,那我们不妨从两个数组的两边接近它们。首先,两个指针i,j分别位于A0号位和Bn-1号位;然后i先开始往后移动,此时A\left [ i \right ]+B\left [ j \right ]会逐渐变大,直到A\left [ i \right ]+B\left [ j \right ]>x,此时调整j的位置(往前移动),直到A\left [ i \right ]+B\left [ j \right ]不大于x,当调整完后,进行判断,如果A\left [ i \right ]+B\left [ j \right ]= x,那么就找到了答案,结束循环;如果A\left [ i \right ]+B\left [ j \right ]<x,那么继续调整i,j的位置,最后两者将会逼近到答案。

        3. 子序列匹配

          例题:AcWing-2816. 判断子序列

        题目大意:给定一个长度为n的整数序列a以及一个长度为m的整数序列b,请你判断序列a序列是否为b序列的子序列。

        具体思路:维护两个指针i,jia数组开始位置遍历,jb数组开始位置遍历;j先开始往后移动,直到a\left [ i \right ]=b\left [ j \right ],将i,j同时加一,再继续遍历;最后,当b数组遍历到最后一位时,说明已经比对完毕,只用看看a数组有没有遍历完,如果遍历完毕,则说明a序列是为b序列的子序列,反之不是。

性质

        时间复杂度

        双指针算法的时间复杂度一般是O\left ( n \right )的。

Q:双指针算法有两个指针,代码上也是两重循环,看似是O\left ( n^{2} \right )的时间复杂度,为什么时间复杂度是O\left ( n \right )的呢?

A:最最核心的就是,两个指针都是同时遍历的他们只会从头走到尾,因此时间复杂度是O\left ( 2n \right ),在O\left ( n \right )量级。

代码

        下面给出双指针算法的实现代码:

for(int i=0,j=0;i<n;i++){while(j<i&&check(i,j)) j++;}
        代码解释

        check()函数的作用是检查i,j是否满足某种性质;while循环下一行是写具体问题的逻辑的。


上一篇-二维差分的实现    C++算法基础专栏文章    下一篇-位运算的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot项目的行为验证码AJ-Captcha(源码解读)

目录 前言1. 复用验证码2. 源码解读2.1 先走DefaultCaptchaServiceImpl类2.2 核心ClickWordCaptchaServiceImpl类 3. 具体使用 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目…

针对datax-web 中Swagger UI接口未授权访问

application.yml 添加以下配置 实现访问doc.html 以及/v2/api-docs 接口时需要进行简单的校验 swagger:basic:enable: trueusername: adminpassword: 12345 配置重启后再进行相关访问则需要输入用户名和密码

Ubuntu 24.04 LTS Noble安装 FileZilla Server

FileZilla Server 是一款使用图形用户界面快速创建 FTP 服务器的软件。它有助于测试需要 FTP 服务器功能的各种项目。虽然早期的 FileZilla FTP 服务器仅适用于 Windows 和 macOS&#xff0c;但现在我们也可以在 Linux&#xff08;例如 Ubuntu 24.04&#xff09;上安装 FileZil…

c++红黑树,插入公式

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近…

C++ STL set_symmetric_difference

一&#xff1a;功能 给定两个集合A&#xff0c;B&#xff1b;求出两个集合的对称差&#xff08;只属于其中一个集合&#xff0c;而不属于另一个集合的元素&#xff09;&#xff0c;即去除那些同时在A&#xff0c;B中出现的元素。 二&#xff1a;用法 #include <vector>…

【前端手写代码】手写Object.create

思路&#xff1a;将传入的对象作为原型 // 思路&#xff1a;将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }

Go 语言单例化利器 Once

Once 可以用来执行仅仅执行一次的动作,常常被应用于单个对象的初始化场景。 1. Once 的使用方法 sync.Once 只暴露了一个方法 Do,你可以多次调用 Do 方法,但是只有第一次调用 Do 方法时参数 f 才会执行,这里的 f 是一个无参数、无返回值的函数。 func (o *Once) do(f func…

学习java第一百四十二天

ApplicationContext通常的实现是什么&#xff1f; FileSystemXmlApplicationContext &#xff1a;此容器从一个XML文件中加载beans的定义&#xff0c;XML Bean配置文件的全路径名必须提供给它的构造函数 ApplicationContext context new FileSystemXmlApplicationContext(&quo…

Docker安装 OpenResty详细教程

OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了 Lua 脚本语言&#xff0c;使得开发者可以在 Nginx 服务器上轻松地进行动态 Web 应用开发。OpenResty 的核心目标是通过将 Nginx 的高性能与 Lua 的灵活性结合起来&#xff0c;提供一个强大且高效的 Web 开发…

Redis备份策略面试三道题

关于Redis备份策略的面试题&#xff0c;由简单到困难&#xff0c;可以给出以下三道题目及其参考答案&#xff1a; 1. 简单题&#xff1a;Redis支持哪些主要的备份方式&#xff1f; 参考答案&#xff1a; Redis支持两种主要的备份方式&#xff1a; RDB&#xff08;Redis Data…

Hadoop3.3.5的安装与单机/伪分布式配置

文章目录 一、安装须知二、安装jdk三、安装shh四、安装配置hadoop五、运行hadoop 一、安装须知 本次安装的Hadoop版本为hadoop3.3.5。 在这之前完成了VMware虚拟软件的安装&#xff0c;并安装了Ubuntu22.04&#xff0c;在这基础上进行相关配置。 二、安装jdk 在Ubuntu中使用…

MongoDB - 组合聚合阶段:$group、$match、$limit、$sort、$skip、$project、$count

文章目录 1. $group2. $group-> $project2.1 $group2.2 $group-> $project2.3 SpringBoot 整合 MongoDB 3. $match-> $group -> $match3.1 $match3.2 $match-> $group3.3 $match-> $group-> $match3.4 SpringBoot 整合 MongoDB 4. $match-> $group->…

cesium海洋到站提示

项目地址:Every Admin: 用于快速搭建后台管理和其他页面的项目,组件化开发,以及大屏展示. <template> <div class"topbox"> xx海洋管理 </div> <div class"selectbox"> <div class"title"> 航线列表 </div>…

以乐观心态拥抱生活,坚信美好终会降临

在人生的漫漫长河中,我们每个人都如同漂泊在波涛汹涌的大海上的一叶扁舟,时而遭遇狂风骤雨,时而沐浴温暖阳光。生活中的种种际遇,或喜或忧,或顺或逆,如同变幻莫测的风云,常常让我们心生焦虑与不安。然而,我要在这里郑重地告诉您:凡事您不必担心,会有个好结局的。这并…

2024年暑假ACM集训第1场

A:小青蛙跳台阶 题目描述 想必你应该做过这么一道题&#xff1a;一只小青蛙一次可以跳1级台阶&#xff0c;也可以一次跳2级台阶。求该青蛙跳上第N级台阶总共有多少种跳法&#xff1f;&#xff08;假设小青蛙的初始位置是第0级台阶&#xff09; 现在小青蛙遇到了一点麻烦&#x…

Docker快速搭建WordPress博客系统网站

WordPress 是一款广泛使用的开源内容管理系统(CMS),用于创建和管理网站和博客。 主要功能: 易于使用的界面:WordPress 提供了一个直观的后台管理界面,使用户能够轻松创建、编辑和管理网站内容。 主题和模板:WordPress 提供了各种主题和模板,可根据网站需求进行选择和自…

MQ消息队列+Lua 脚本实现异步处理下单流程

具体实现和代码可参考我以前做过的笔记&#xff1a;《黑马点评》异步秒杀优化|消息队列 回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1…

前端(1)HTML

1、标签 创建1.html文件&#xff0c;浏览器输入E:/frontheima/1.html&#xff0c;可以访问页面 页面展示 在VSCODE安装IDEA的快捷键&#xff0c;比如ctld复制一行、ctrlx剪切 <p id"p1" title"标题1">Hello,world!</p> <p id"p2"…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

网络安全新纪元:挑战、趋势与应对策略

引言 随着数字化时代的到来&#xff0c;网络安全不仅成为国家稳定发展的重要保障&#xff0c;也是国家安全的重要组成部分。近年来&#xff0c;网络安全领域面临着前所未有的挑战与机遇&#xff0c;一系列引人注目的趋势和预测逐渐浮出水面。本文将从网络安全的现状、面临的挑…