当前位置: 首页 > news >正文

双指针算法实例1(移动零)

常⻅的双指针有两种形式:

1 对撞指针(左右指针):

a 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼

b 终止条件一般是两指针相遇or错过(也可能在循环过程中找到结果直接跳出循环),即

    left == right (两个指针指向同⼀个位置)
    left > right   (两个指针错开)

2 快慢指针:

   使⽤两个移动速度不同的指针在数组或链表等结构上移动

   特别是处理环形链表或数组时有很大用处,也就是说当问题出现循环往复的情况时,可考虑使用快慢指针的思想

题目:

给定一个数组 ,编写一个函数将所有 移动到数组的末尾,同时保持非零元素的相对顺序。nums0

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

 

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

代码实现:

class Solution
{
public:void moveZeroes(vector<int>& nums){int cur = 0;//遍历数组int pre = -1;//指向非0元素区域中最后一个非0元素while(cur<nums.size()){if(nums[cur])//找到非0元素{swap(nums[++pre],nums[cur]);//将非0元素与0元素交换,++pre指向的一定是0元素}cur++;}}
};

思路详解:

题目要求实现的功能,可以说是数组划分(数组分块)让非0元素排在前半部分,0元素排在后半部分,且要求元素间的相对顺序保持不变。

方法:

前后指针法

(此处的指针是用数组的下标来充当的,并不是真正意义上的指针)

1 cur指针去从左向右遍历数组(只需要一直向前走就行)指向的是待处理的元素

2 pre指针记录已处理区间内的非0元素区域,最后一个非0元素的下标

cur初始化为0,因为要从0下标开始遍历

pre初始化为-1,因为pre指向的是已处理区间中的非0元素区的最后一个非0元素下标,刚开始还没有确定任何一个元素是否是非0元素

思想:

cur负责遍历数组,指向待处理的元素:

找到的是非0元素,则将它交换到前面

找到的是0元素,则视而不见,直接++走向下一个待处理元素

pre指向的始终是已处理区间中的非0元素区的最后一个非0元素的下标,cur因为遇到0而不断++,与pre拉开距离

那么[pre+1,cur-1]的区间是已处理区间中的0元素区

在处理过程中,数据分三区:

[0,pre]:全都是非0元素

[pre+1,cur-1]:全是0元素

[cur,n-1]:n是数组元素个数,是待处理的元素

 

简单来说,就是cur在遍历过程中若是遇到非0元素,则将它与0元素交换,让非0元素换到前面,0元素换到后面,[pre+1,cur-1]的区域内全是0元素,遇到0元素则不管,直接++找下一个待处理元素

完结撒花~ 

题外话:解决此题目的前后指针法其实和快排中实现数组划分的方法之一类似,也可以成之为前后指针法,但是实现略有差异,且在实现后,快排中数组元素的相对顺序可能会发生改变

详情在我的另一篇快排模拟实现的博客中:

http://t.csdn.cn/2Km96

http://www.lryc.cn/news/130693.html

相关文章:

  • C#程序随系统启动例子 - 开源研究系列文章
  • 最全攻略之人工智能顶会论文发表
  • Redis基于内存的key-value结构化NOSQL(非关系型)数据库
  • Spring学习笔记+SpringMvc+SpringBoot学习笔记
  • 如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?
  • 集简云推出的全国第一款 AI+连接器解决方案产品语聚AI
  • git错误记录
  • linux使用jmeter进行压测
  • leetcode 139. 单词拆分
  • 若依的使用(token补充、HTTPS(网络安全)、分页前后端配置)
  • Java源码分析(一)Integer
  • WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机
  • 【基于鲲鹏及openEuler20.03TLS下MySQL8.0.17性能调优】
  • GRPC 学习记录
  • C++语言的QT写软件界面,结合python深度学习模型的综合应用处理方案
  • Linux环境下python连接Oracle教程
  • 第 7 章 排序算法(1)
  • wsl,字体乱码问题
  • 【NetCore】10-路由定义
  • 软考:中级软件设计师:数据库模式、ER模型
  • 海量数据迁移,亚马逊云科技云数据库服务为大库治理提供新思路
  • DevOps系列文章之 GitlabCICD自动化部署SpringBoot项目
  • 汽车租赁管理系统/汽车租赁网站的设计与实现
  • 语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、路径覆盖
  • 二进制逻辑运算符
  • Bug日记-webstorm运行yarn 命令报错
  • C++11并发与多线程笔记(9) async、future、packaged_task、promise
  • Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析
  • opencv直方图与模板匹配
  • Apache Doris 入门教程31:计算节点