算法——双指针

目录

  • 前言
  • 一、什么是双指针
  • 二、算法特点
  • 三、算法实现步骤
  • 四、常见形式
  • 五、应用场景与示例
  • 六、优势与注意事项
  • 七、双指针算法动态图解
  • 八、经典例题
    • [1. 回文判定](https://www.lanqiao.cn/problems/1371/learning/?page=1&first_category_id=1&name=%E5%9B%9E%E6%96%87%E5%88%A4%E5%AE%9A)
      • 代码题解
    • [2. 反转字符串中的字符](https://www.lanqiao.cn/problems/250/learning/?page=1&first_category_id=1&name=%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6)
      • 代码题解
    • 3.等腰三角
      • 代码题解
  • 结语

前言

双指针算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解递推。
在这里插入图片描述

一、什么是双指针

双指针算法涉及使用两个指针(索引或引用),通常分别称为“快指针”和“慢指针”或“左指针”和“右指针”,以协同进行遍历或搜索。该算法的核心思想是通过移动这两个指针来实现特定的目标,例如寻找一对元素的和、判断是否存在某种关系或在特定条件下移动其中一个指针。

二、算法特点

时间复杂度低:
双指针算法通常能够在O(n)的时间复杂度内解决问题,相较于暴力搜索的O(n^2)时间复杂度,具有显著的优势。
这是因为双指针算法通过同时操作两个指针,减少了重复计算和遍历次数。

空间复杂度低:
双指针算法通常只需要常数级别的额外空间,即O(1)的空间复杂度。这使得双指针算法在处理大规模数据时更加高效,因为它不需要额外的存储空间来存储中间结果。

适用性强:
双指针算法可以应用于多种数据结构,如数组、链表等。
它还可以用于解决多种类型的问题,如查找和排序、判断链表是否有环、计算最大子数组和等。

三、算法实现步骤

1.初始化指针:根据问题的具体需求,选择合适的初始位置来初始化指针。

2.遍历数据结构:使用循环遍历数据结构,同时操作两个指针。

3.判断条件:在遍历过程中,根据当前指针位置和目标条件来判断是否满足要求。

4.移动指针:根据判断结果,移动指针以继续搜索或缩小搜索范围。

5.记录结果:当找到满足条件的解时,记录结果并继续搜索,直到遍历完整个数据结构。

四、常见形式

对撞指针:两个指针分别从线性数据结构的两端向中间移动,常用于查找和排序问题。例如,在有序数组中查找和为特定值的两个数,可以使用一个头指针和一个尾指针,分别指向数组的最左边和最右边,通过比较两个指针指向的值与目标值的大小关系,移动指针来缩小搜索范围。

快慢指针:一个指针移动速度较快,另一个移动速度较慢。这常用于解决链表中的问题,如判断链表是否有环、找到链表的中间节点等。快慢指针相遇时,可以判断链表是否有环,并通过调整指针位置找到环的起点。

滑动窗口:使用两个指针维护一个窗口,通过移动窗口的左右边界解决问题。这类问题常见于字符串和数组处理,例如找到最短的包含所有字符的子串或计算数组中的最大子数组和等。

同向双指针:两个指针方向相同,通过控制其中一个指针的位置来处理问题。例如,在一个有序数组中查找两个数,使它们的和等于给定值。

五、应用场景与示例

移动零:使用双指针将数组中的零移动到末尾,同时保持非零元素的相对顺序。

复写零:在原数组上复写零,即每遇到一个零,就在其后面再添加一个零,同时保证不覆盖后面的数字。

快乐数:判断一个数是否为快乐数。快乐数定义为:一个正整数,每一次将该数替换为其每个位置上的数字的平方和,然后重复这个过程,直到这个数变为1,也可能是无限循环但始终变不到1。可以使用快慢指针的思想来判断是否存在循环。

盛最多水的容器:给定一个整数数组,其中每个元素代表一个垂直线条的高度,找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。可以使用双指针从两端向中间遍历,通过比较高度移动指针来找到最大面积。

有效三角形的个数:给定一个包含非负整数的数组,判断其中可以组成三角形的三个数的个数。可以先对数组进行排序,然后使用双指针来判断任意三个数是否能组成三角形。

三数之和:给定一个包含n个整数的数组,判断该数组中是否存在三个元素a,b,c,使得a+b+c=0?找出所有满足条件且不重复的三元组。可以使用双指针在排序后的数组中遍历并查找满足条件的三元组。

六、优势与注意事项

双指针算法通常能够在O(n)的时间复杂度内解决问题,具有较好的效率。然而,在使用双指针算法时需要注意以下几点:

初始化指针位置:根据问题的具体需求,选择合适的初始位置来初始化指针。

控制指针移动:根据当前指针位置和目标条件来决定如何移动指针。

避免重复计算:在移动指针时,要注意避免重复计算已经处理过的元素。

处理边界情况:对于数组为空或仅有一个元素等边界情况,需要进行特殊处理。

七、双指针算法动态图解

在这里插入图片描述
在这里插入图片描述

八、经典例题

1. 回文判定

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<string>
using namespace std;
string s;
int main()
{cin>>s;int l=0,r=s.size()-1;while(l<r){if(s[l]==s[r])l++,r--;else {cout<<"N"<<endl;break;}}if(l>=r)cout<<"Y"<<endl;return 0;
}

2. 反转字符串中的字符

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<cstring>
using namespace std;
int main()
{char s[1000];cin.getline(s,101,'\n');int l=0;int r=strlen(s)-1;while(l<r){swap(s[l],s[r]);l++,r--;}cout<<s<<endl;return 0;
}

3.等腰三角

(帅哥这个蓝色字体可以点进去看原题)

代码题解

#include <iostream>
#include<algorithm>
using namespace std;#define maxn 200001
int A[maxn],B[maxn],C[maxn];
//  1 2 3 4     A
//  2 4 6 8     C
//  2 2 3 4     B
//  i
//  j
int main()
{int n;cin>>n;for(int i=0;i<n;i++){cin>>A[i];C[i]=2*A[i];}for(int i=0;i<n;i++){cin>>B[i];}sort(C,C+n);//对c数组进行递增排序sort(B,B+n);//与c数组同理int i=0,j=0,ans=0;while(i<n&&j<n){if(C[i]>B[j])j++,ans++;//两个数组排好序之后,如b[j]>=c[i],那么也就是说j以后的b数组所有数都比c[i]大,i++i++;}cout<<ans<<endl;return 0;
}

结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,不会的地方就问,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。

在这里插入图片描述

关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

L6.【LeetCode笔记】合并两个有序链表

1.题目 https://leetcode.cn/problems/merge-two-sorted-lists/ 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&…

类的加载机制

一、类的生命周期 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a; 加载&#xff08;Loading&#xff09;验证&#xff08;Verification&#xff09;准备&#xff08;Preparation&#xff09;解析&#xff08…

接口测试用例设计的关键步骤与技巧解析

接口测试是确保系统组件之间高效、稳定交互的重要环节。然而&#xff0c;设计出合理的接口测试用例&#xff0c;并不是一件轻而易举的事。如何通过高质量的测试用例揭示潜在问题&#xff1f;今天带你深度解析接口测试用例设计的关键步骤和实用技巧&#xff0c;助你在测试领域更…

Java线程6种生命周期及转换

多线程技术是我们后端工程师在面试的时候必问的一个知识点&#xff0c;今天就来盘点一下多线程的相关知识&#xff0c; 先来说下进程&#xff0c;线程及线程的生命周期&#xff1a; 进程&#xff1a;进程就是正在进行中的程序&#xff0c;是没有生命的实体&#xff0c;只有在运…

柯桥学英语|老外说“You‘re cheap”,不是“你真便宜”!真正的意思是什么?

在跨文化交流中&#xff0c;误解常常源于对语言字面意义的直接翻译。今天&#xff0c;我们就来揭开一个常见的误解——“Youre cheap”的真实含义&#xff0c;并探讨与之相关的英文表达。 “Youre cheap”的真实含义 当老外对你说“Youre cheap”&#xff0c;千万别以为他们在…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

电商行业企业员工培训的在线知识库构建

在电商行业&#xff0c;员工的培训和发展对于保持竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;电商行业需要不断适应新的市场趋势。在线培训知识库作为一种有效的培训工具&#xff0c;可以帮助企业提升员工技能&#xff0c;优化客户服务&#xff0c;增强…

参数跟丢了之JS生成器和包装器

如需转载请注明出处.欢迎小伙伴一起讨论技术. 逆向网址:aHR0cHM6Ly91bmlvbi5qZC5jb20vcHJvTWFuYWdlci9pbmRleD9wYWdlTm89MQ 跟踪接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp 跟踪参数:h5st 本文目标:记录学习下自定义的生成器和包装器,不做具体的参数加密逻辑分析 直接启动器进…

信息学奥赛一本通 1395:烦人的幻灯片(slides)

【题目链接】 ybt 1395&#xff1a;烦人的幻灯片(slides) 【题目考点】 1. 图论&#xff1a;拓扑排序 【解题思路】 先理解题意&#xff1a; 如图&#xff0c;每张幻灯片是一个矩形&#xff0c;在该矩形范围内有一个位置写了这张幻灯片的编号。但实际情况是幻灯片是透明…

SpringBoot框架学习总结 及 整合 JDBC Mybatis-plus JPA Redis 我的学习笔记

SpringBoot框架学习总结 及 整合 JDBC Mybatis-plus JPA Redis 我的学习笔记 一、SpringBoot概述二、创建SpringBoot程序1. 使用maven方式创构建2. 使用Spring Initializr构建3. SpringBoot热部署4. SpringBoot的跨域处理 三、基础配置1.配置文件的作用2.配置文件格式2.yaml3.S…

真题--数组循环题目

1.逆序数表达数组2.用数组表示费波纳希数列3.用数组排序4.二维数组转置5.找到二维数组其中的最大数值6.输出字符数组7.字符数组输出菱形图案8.输入一行字符&#xff0c;统计有多少单词9.有三个字符串&#xff0c;找到最大字符串 1.逆序数表达数组 #include<stdio.h> int…

精美的Python Rich

今天给大家推荐一个非常精美的终端工具 - Python Rich Rich 是一个专为 Python 开发者打造的终端美化库&#xff0c;能让你的控制台输出内容更具视觉效果&#xff01;通过简单易用的 Rich API&#xff0c;可以快速为终端文本添加颜色和样式&#xff0c;让原本单调的输出变得丰…

【react框架之dvajs】dva数据流你可能还不知道的subscriptions隐藏的秘密

Subscriptions 是一种从 源 获取数据的方法&#xff0c;它来自于 elm。 语义是订阅&#xff0c;用于订阅一个数据源&#xff0c;然后根据条件 dispatch 需要的 action。数据源可以是当前的时间、服务器的 websocket连接、keyboard 输入、geolocation 变化、history 路由变化等等…

基于单片机的燃气报警阀门系统

本设计基于单片机的燃气报警阀门系统&#xff0c;燃气报警阀门系统采用STM32主控制器为核心芯片&#xff0c;外围电路由燃气传感器、OLED液晶显示模块、按键模块、蜂鸣器报警模块、电磁阀以及SIM800模块等模块组成。燃气传感器模块负责采集燃气浓度数据&#xff0c;采集完成由S…

python怎么去掉换行符

换行符与其他字符并没有区别&#xff0c;由于换行符总是最后一个字符&#xff0c;所以直接选择除去最后一个字符的所有字符即可。 x abc\n x[:-1] 也可以使用字符串的strip()方法 但是strip()方法除了会去掉换行符&#xff0c;还会去掉空格等其他字符。 x.strip()

Webserver(4.4)多进程/多线程实现并发服务器

目录 多进程实现并发服务器多线程实现并发服务器TCP状态转换 多进程实现并发服务器 要实现TCP服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决 一个父进程&#xff0c;多个子进程 父进程负责等待并接受客户端的连接 子进程&#xff1a;完成通信&#xff0c;接收一…

Pinterest会成为亚马逊的新流量入口吗?

Pinterest 作为一个以图片分享为主的社交媒体平台&#xff0c;全球月活跃用户约为 4.368亿。同时&#xff0c;Pinterest 的用户群体以女性为主&#xff0c;占比高达 70% 以上&#xff0c;且多数是 18 岁到 44 岁之间的中高收入人群&#xff0c;具有较强的购买力和消费能力。对于…

SpeechT5 模型

微软开源的 SpeechT5 语音模型&#xff0c;主要包括以下功能 语音转文字&#xff1a;用于自动语音识别&#xff08;ASR&#xff09;。文字转语音&#xff1a;用于合成音频&#xff08;TTS&#xff09;。语音转语音&#xff1a;用于不同声音之间的转换或进行语音增强。 T5 网络…

.NET 8 中 Entity Framework Core 的使用

本文代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具&#xff0c;为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进&#xff0c;开发人…

我要精通前端-块级元素和行内元素再度深入学习笔记

真的发现前端天天增删改查&#xff0c;真的是问一些比较细节的知识&#xff0c;我真的懂么 1、块级元素间的margin会重叠&#xff0c; <div class"head"></div> <div class"content"></div>.head {margin: 5px;border: 10px sol…