算法学习——双指针

news/2024/12/15 14:09:47/

今天我来分享下算法中的双指针

概念:

双指针是一种常见的算法技巧,通常用于解决数组和链表相关的问题的。

它通过使用两个指针来遍历数据结构,从而在一次遍历中完成某些任务,提高了效率。

注意这里的指针,可不是C语言常说的那种指针,而是更多的用下标来表示

那么常见的双指针有两种形式:对撞指针,快慢指针

对撞指针:

一般用于顺序结构中,也称左右指针

1.对撞指针从两端向中间移动。一个指针从最左端开始,一个指针从最右端开始,然后逐渐往中间逼近

2.对撞指针的终止条件一般是两个指针相遇或者错开(也有可能在循环内部找到结果,就跳出循环直接返回了)

相遇:left==right

错开:left>right

注意这里的left 和 right指的是下标

快慢指针:

又称为龟兔赛跑指针,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

这种方法对于处理环形链表或数组非常有用。

当然,如若处理的问题也有像是出现循环往复的情况时,也是可以考虑快慢指针的思想

其中常见的实现方式:

在一次循环中,每次让慢的指针向后移动一位,而快的指针往后移动两位,实现一快一慢。

所以,总的来说,就是双指针就是可以在一些遍历过程的时候,优化遍历结构,从而提高代码运行效率。

下面用两道题来拓展下对撞指针和快慢指针吧。

对撞指针:

看到这道题,我们一般会想到枚举的方式,类似一种暴力破解的方法

类似于这样:

其实一般情况下是可以解决的,但是一旦数据量大了之后,就不好说了

所以在这道题中呢,用这种解法是超时的。

所以我们用这个对撞指针来解决下

代码:

  public int[] twoSum(int[] price, int target) {//思路:使用双指针算法、暴力解法(超时)//首先,让right和left下标对应的值,相加,然后呢,如若小于这个target//那么left++;否则right--。等于返回数组这两个下标对应的值int left =0;int right=price.length-1;int [] arr=new int[2];        while(left < right){if(price[left]+price[right]<target){left++;}else if(price[left]+price[right] > target){right--;}else{arr[0]=price[left];arr[1]=price[right];break;}}return arr;}

注意,返回的类型是int [],所以我们返回值也得是对应的类型。

快慢指针:

这道题意思是:

所以可以看到这里是成环了,使用下快慢指针

我们首先要求出这个82怎么求

设置一个sumPow()方法来其对应的值

那么其实也是挺简单的,用一个sum+=数字位数上的平方值

比如19,有两位,那么先求个位平方,那么可以19%10=9

sum+=9*9

然后19/10=1

得到十位上的数字

那么再次sum+=1*1,这样就得出了82了

那么回到快慢指针上

先定义一个slow、fast指针

那么这个指针的值,即slow=sumPow()方法求出每一步的值,fast因为要走两步,所以fast=sumPow(sumPow())

我们可以先让slow一次走一步,fast一次走两步

最后,fast进入环,slow也在一个环中且相遇的时候,判断下fast/slow的值是否等于1即可

代码:

public int sumPow(int n){int sum=0;while(n!=0){int t=n%10;sum+=t*t;n/=10;}return sum;}public boolean isHappy(int n) {//思路,使用快慢指针法//在这个快乐数中,当按照题目的走法,即n=19,此时最后会走到1,//而1会一直循环,即成环了,而且环中都是1,如若n=2//那么走到后面也会成环,但环中不会出现1,所以这个是不符合题目要求的  //所以判断下成环的时候里面的值是否为1 int slow =n;//这里要fast多走一步,是因为要进入循环内,//如若一开始都是fast=slow,就不进入循环int fast=sumPow(n);while(slow!=fast){slow=sumPow(slow);fast=sumPow(sumPow(fast));}return fast==1;}
}

完!


http://www.ppmy.cn/news/1555314.html

相关文章

GIGABYTE技嘉主板电脑前端耳机接口无声音输出

一、基本情况 今年5月份&#xff0c;台式机电脑配有外放音响&#xff0c;接在主机后端耳机口。使用外放音响多&#xff0c;很少使用前置耳机接口。今天感觉外放效果不明显&#xff0c;想用耳机。拔掉外放音响后&#xff0c;耳机插入前端接口&#xff0c;发现没有声音输出。于是…

python学opencv|读取图像(九)用numpy创建黑白相间灰度图

【1】引言 前述学习过程中&#xff0c;掌握了用numpy创建矩阵数据&#xff0c;把所有像素点的BGR取值设置为0&#xff0c;然后创建纯黑灰度图的方法&#xff0c;具体链接为&#xff1a; python学opencv|读取图像&#xff08;八&#xff09;用numpy创建纯黑灰度图-CSDN博客 在…

状态管理实战:一次 Redux 到 React Query 的重构之旅

"老师,我们的后台管理系统状态管理好混乱啊&#xff01;"上周二的代码评审会上,小王一脸苦恼地说道。我打开代码仓库看了看,确实问题不小 - Redux store 里堆满了各种数据,有本地状态,有服务器数据,还有一些缓存,导致代码难以维护,性能也受到影响。 说实话,这个问题…

XML 在线格式化 - 加菲工具

XML 在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

ERC论文阅读(03)--instructERC论文阅读笔记(2024-12-14)

instructERC论文阅读笔记 2024-12-14 论文题目&#xff1a;InstructERC: Reforming Emotion Recognition in Conversation with Multi-task Retrieval-Augmented Large Language Models 说明&#xff1a;以下内容纯属本人看论文及复现代码的记录&#xff0c;如想了解论文细节&…

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…

数据结构(顺序表)JAVA方法的介绍

前言 在 Java 中&#xff0c;集合类&#xff08;Collections&#xff09;是构建高效程序的核心组件之一&#xff0c;而 List 接口作为集合框架中的重要一员&#xff0c;是一个有序、可重复的元素集合。与 Set 接口不同&#xff0c;List 保证了元素的顺序性&#xff0c;并允许存…

超标量处理器设计笔记(9) 重命名映射表、超标量处理器重命名中相关性问题

寄存器重命名 重命名映射表基于 SRAM 的重命名映射表 超标量处理器的寄存器重命名解决 RAW 相关性解决 WAW 相关性对写 RAT 进行检查&#xff08;判断哪个 ARF 写入到 RAT&#xff09;对写 ROB 进行检查&#xff08;判断&#xff09; 特殊指令处理方式 重命名映射表 重命名时…