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

优选算法:01 双指针巧解移动零问题


🔥个人主页:K 旺仔小馒头

🍉学习方向:C/C++方向学习者

📖个人专栏:《C语言》《数据结构与算法》《C++知识分享》《C语言实战编程》《算法题从优选到贪心的解题技巧》

⭐️人生格言:‌“何时葡萄先熟透,你要静候再静候”



目录

前言:

双指针算法:

1. 对撞指针:

2. 快慢指针:

01. 移动零

1.1 题目链接:

1.2 题目描述:

1.3 解法(快排的思想:数组划分区间-数组分两块):

算法思路:

算法流程:

1.4 C++算法代码:

1.5 算法总结:

1.6 手写笔记:

结尾:


前言:

双指针算法是解决数组类问题的高效工具,其简洁的逻辑与较低的时间复杂度,使其成为算法学习中的重点内容。本文聚焦双指针的两种核心形式,以经典的 “移动零” 问题为切入点,结合快排分块思想,通过清晰的思路拆解、流程说明与 C++ 代码实现,带读者深入理解算法本质,为后续攻克复杂数据结构问题打下基础。


双指针算法:

常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。

1. 对撞指针:

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

  • 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近。
  • 对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right(两个指针指向同一个位置),left > right (两个指针错开)

2. 快慢指针:

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

这种方法对于处理环形链表或数组非常有用。 其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。 快慢指针的实现方式有很多种,最常用的一种就是:

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

01. 移动零

「数组分两块」是非常常见的一种题型,主要就是根据一种划分方式,将数组的内容分成左右两部分。这种类型的题,一般就是使用「双指针」来解决。

1.1 题目链接:

283. 移动零

1.2 题目描述:

1.3 解法(快排的思想:数组划分区间-数组分两块):

算法思路:
  • 在本题中,我们可以用一个cur 指针来扫描整个数组,另一个dest 指针用来记录非零数序列的最后一个位置。根据cur 在扫描的过程中,遇到的不同情况,分类处理,实现数组的划分。
  • cur 遍历期间,使[0, dest] 的元素全部都是非零元素, [dest + 1, cur - 1] 的元素全是零。
算法流程:

1. 初始化cur = 0(用来遍历数组),dest = -1 (指向非零元素序列的最后一个位置。因为刚开始我们不知道最后一个非零元素在什么位置,因此初始化为-1

2. cur 依次往后遍历每个元素,遍历到的元素会有下面两种情况:

  1) 遇到的元素是0cur 直接 ++ 。因为我们的目标是让[dest + 1, cur - 1] 内的元素全都是零,因此当cur 遇到0 的时候,直接 ++ ,就可以让0cur - 1 的位置上,从而在[dest + 1, cur - 1]内;

  2) 遇到的元素不是0dest++ ,并且交换cur 位置和dest 位置的元素,之后让cur++ ,扫描下一个元素。

  • 因为dest 指向的位置是非零元素区间的最后一个位置,如果扫描到一个新的非零元素,那么它的位置应该在dest + 1 的位置上,因此dest 先自增1
  • dest++ 之后,指向的元素就是0 元素(因为非零元素区间末尾的后一个元素就是 0),因此可以交换到cur 所处的位置上,实现[0, dest] 的元素全部都是非零元素, [dest + 1, cur - 1] 的元素全是零。

1.4 C++算法代码:

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur = 0,dest = -1; cur < nums.size(); cur++){if(nums[cur] != 0){dest++;swap(nums[cur],nums[dest]);}}}
};

1.5 算法总结:

这个方法是往后我们学习「快排算法」的时候,「数据划分」过程的重要一步。如果将快排算法拆解的话,这一段小代码就是实现快排算法的「核心步骤」。

1.6 手写笔记:


结尾:

往期精选:

《string 类模拟实现(上):从构造析构到插入操作的逐步实现》

《string 类模拟实现(下):补全核心功能,吃透字符串操作底层逻辑》

结语:本文围绕双指针算法展开,从理论形式到实际应用,以 “移动零” 问题为载体,完整呈现了算法设计与实现的全过程。文中不仅点明其与快排核心步骤的关联,帮助建立知识间的联系,还配套了题目链接与手写笔记,为自主练习提供便利。如果这些内容对你理解双指针算法有帮助,不妨点个赞、收藏本文,也欢迎在评论区交流想法。后续还会分享更多算法实战解析,关注我的账号,一起稳步提升解题能力~

http://www.dtcms.com/a/515911.html

相关文章:

  • 消息队列Kafka
  • 做游戏陪玩网站连锁销售网站制作
  • 【数字逻辑】数字逻辑实验实战:74HC151实现逻辑函数+74HC138搭全加器(附接线步骤+避坑指南)
  • Ubuntu上vue3 vite使用MBTiles搭建地图服务器
  • CClink转EtherCAT协议转换落地——汇川PLC管控球磨机CClink伺服案例
  • wordpress handsome长沙seo免费诊断
  • ChatGPT Atlas 发布:把 AI 直插进浏览器的一次重构
  • 第1章:初识Linux系统——第9节:安装服务软件、维护文件系统安全与文件权限配置实例
  • openAI发布的AI浏览器:什么是Atlas?(含 ChatGPT 浏览功能)macOS 离线下载安装Atlas完整教程
  • 西安市高陵区建设局网站聊城网站制作信息
  • ssh别名和多服务器同步文件
  • 苏州建设网站的公司软件开发和编程的区别
  • Linux I²C 总线驱动开发:从架构到实战的完整指南
  • Eureka控制台页面参数说明 ​
  • 智慧养老+适老化改造:科技与温情的双向奔赴,让晚年生活更有尊严
  • 什么是网络安全,网络空间安全有哪些安全?
  • 深圳网站建设要多少钱网站开发h5技术
  • 【浙江政务服务网-注册_登录安全分析报告】
  • 二十三、K8s企业级架构设计及落地
  • 网站建设销售客户开发创建个人网站的步骤
  • MySQL覆盖索引深度解析:从原理到实践的性能优化之道
  • 国产中间件与浏览器选型指南:覆盖政务、金融、电信应用场景
  • linux学习笔记(49)Redis详解(1)
  • 扩展、Docker-compose-1
  • Label Smoothing
  • 深入理解 MySQL 锁机制:全局锁、表锁与行锁
  • 本科专业 网站开发wordpress子站点目录
  • ABP Framework 与 若依(RuoYi) 产品可用性全方位碰撞
  • SharpDevelop下载安装图解(附安装包,适合新手)
  • 深度学习-174-知识图谱技术之langchain与neo4j的结合应用