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

这篇具有很好参考价值的文章主要介绍了双指针算法实例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是数组元素个数,是待处理的元素

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

 

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

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

完结撒花~ 

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

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

http://t.csdn.cn/2Km96文章来源地址https://www.toymoban.com/news/detail-658492.html

到了这里,关于双指针算法实例1(移动零)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双指针算法实例5(有效三角形的个数)

    给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 示例 2: 提示: 1 = nums.length = 1000 0 = nums[i] = 1000 三角形构成条件:任意两边之和一定要大于第三边 其实在判断中,只需要判断 最小的两边和大于最长的一边 即可 假设 a=b=c 若要构成

    2024年02月11日
    浏览(34)
  • 双指针技巧-移动零(java)

    leetcode 283 题。原题链接,可打开测试 https://leetcode.cn/problems/move-zeroes/ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1: 输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0] 示例

    2024年02月08日
    浏览(17)
  • 【H5移动端】常用的移动端方案合集-键盘呼起、全面屏适配、图片大小显示、300ms点击延迟、首屏优化(不定期补充~)

    这篇文章总结了我在工作中做H5遇到的一些问题,包括我是怎么解决的。可能不是当下的最优解,但是能保证解决问题。 单位适配问题可看:【H5移动端】前端H5移动端的单位适配方案集,包括给你用例子讲明白什么是1像素的问题(不定期补充~) 本文章未来也会不定期的补充

    2024年02月14日
    浏览(32)
  • [双指针](一) Leetcode 283.移动零和1089.复写零

    [双指针] Leetcode 283.移动零和1089.复写零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组,将数组中的 所有0移动到数组的末尾 (2) 保证非0元素在数组中 相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容(也就是交换两个数的位置),所以我们很容易

    2024年02月08日
    浏览(31)
  • QT6之类实例化——对象指针和对象

    Qt完全遵循C++ 中类的实例化动作按存储位置可以分为 栈中分配内存 和 堆中分配内存 两种,分别对应不用 new 实例化类和用 new 实例化类。 一、实例化两种方式 1、栈中分配; 如下图是qt非常常见的操作,将m_view声明为对象,它完全表明该对象的生命周期与MyWidget的生命周期相

    2023年04月25日
    浏览(40)
  • C#鼠标拖拽,移动图片实例

    最近工作需要做一个鼠标可以拖拽移动图片的功能。 写了几个基本功能,勉强能用。这里记录一下。欢迎大神补充。 这个就是完成的功能。 下边的绿色是一个pictureBox,白色框也是一个pictureBox,他们二者是子父级关系。 绿色是父级,白色框是子级。 这里插一个知识点:关于

    2024年02月16日
    浏览(27)
  • 用冒泡排序实现快速排序(qsort函数),指针进阶实例

    目录   1、qsort函数是什么 2、冒泡排序实现指针进阶 2.1 主函数 2.2 功能函数声明​编辑 2.3 my_qsort函数介绍 2.4 Swap函数 总结           qsort函数是c语言自带的函数,其功能是实现快速排序。我们来看一下他的参数和返回值:         以上就是qsort的参数和返回值,可以看到,

    2024年02月21日
    浏览(31)
  • 第十五章 Unity 角色移动旋转实例

    本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。 接下来,我们添加一个人物模型,操作方式就是将模型文件目录复制到“Assets”下 然后Unity会自动同步该文件,我

    2024年02月06日
    浏览(28)
  • 【unity细节】为什么发射炮弹实例化出来了却无法移动

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :unity细节和bug 为什么发射炮弹实例化出来了却无法移动 ? 1. 如果全部勾选上那么该预制炮弹无法进行移动 2.炮弹的碰撞网格是否和炮管的碰撞网格 相重合导致,摩

    2024年02月14日
    浏览(45)
  • Unity 之 使用原生UGUI实现随手移动摇杆功能经典实例

    本文最终实现效果: 做一个实验看一下使用 ScrollRect 组件实现摇杆的原理。 在 Hierarchy 面板右键 UI - Scroll View 创建一个滚动视图,这个组件经常被应用于排行榜,选角色之类的可滑动的界面。 在 Scroll View - Viewport - Content 添加一个Image组件 运行场景,鼠标点击并拖动中间部分

    2024年01月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包