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

         这是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;因而是接近…

Docker安装 OpenResty详细教程

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

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

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

cesium海洋到站提示

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

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;也就是我们提出问题的时候&…

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…

C++程序的UI界面闪烁问题的解决办法总结

Windows C++程序复杂的UI界面要使用多种绘图技术(使用GDI、GDI+、ddraw、D3D等绘图),并要贴图去美化,在窗口移动或者改变大小的时候可能会出现闪烁。下面罗列一下UI界面产生闪烁的几种可能的原因,并给出相应的解决办法。 1、原因一 如果熟悉显卡原理的话,调用GDI函数向屏…

【动态规划】不同路径

不同路径&#xff08;难度&#xff1a;中等&#xff09; AC代码 有点水 class Solution { public:int uniquePaths(int m, int n) {//以m为行&#xff0c;n为列&#xff0c;创建二维数组vector <vector<int>> dp(m1,vector<int>(n1));dp[0][1]1;dp[1][0]1;…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具&#xff0c;以此来达到一个内网穿透的目的。简单说一下实验滴环境吧&#xff0c;kali作为攻击机&#xff0c;winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

JavaWeb--Servlet和JSP的基本使用

JavaWeb--Servlet和JSP的基本使用 文章说明servlet和jsp的发展历程最早的手动拼接html页面的servlet使用示例采用jsp技术进行交互与展示页面标签jsp与servlet共同使用、分层处理示例项目下载 文章说明 介绍了javaWeb中Servlet和JSP的基本使用&#xff0c;尽管它们的技术相对比较…

好书推荐 -- 《精通推荐算法》

新书发布&#xff0c;京东限时15天内5折优惠&#xff0c;半天即可送到。 图书封底有读者微信群&#xff0c;作者也在群里&#xff0c;任何技术、offer选择和职业规划的问题&#xff0c;都可以咨询。 《精通推荐算法》&#xff0c;限时半价&#xff0c;半日达https://u.jd.com…

以flask为后端的博客项目——星云小窝

以flask为后端的博客项目——星云小窝 文章目录 以flask为后端的博客项目——星云小窝前言一、星云小窝项目——项目介绍&#xff08;一&#xff09;二、星云小窝项目——项目启动&#xff08;二&#xff09;三、星云小窝项目——项目结构&#xff08;三&#xff09;四、谈论一…

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…