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

leetcode 283. 移动零(详解)双指针c++

题目链接:283. 移动零 - 力扣(LeetCode)

算法原理

解法一:辅助数组

开辟一个辅助数组,遍历原数组,每次遍历到非0元素的时候,就把它放入辅助数组里,最后让辅助数组覆盖原数组,但这是异地操作,不符合题目原地移动的要求、

                                    

解法二:利用双指针(注意是使用变量充当指针,不是真的第一个指针出来,i = 0,相当于有一个指针指向0下标)

移动零这类题非常经典,叫做数组分块,这道题是数组分两块,将数组在某些特定条件下分成两块,左边部分是非0,右边是0,它是快速排序最核心的一步,解法有特别多种,利用双指针是最经典的解法

定义两个指针:

  • cur:标记非0元素的最后一个位置(上图右边)
  • i:扫描数组

整个数组会结合这个 i 分成三个区域,[0, cur] 非0区域,[cur+1, i-1] 0区域,0[i, n-1]待扫描区域,用题目中的示例,[0,1,0,3,12],cur指向-1下标,i指向0下标,一开始 i 指向0元素,直接i++,0还是在 [cur+1, i-1] 区域的,i 指向非0元素,因为有0的干扰,[cur+1] 位置有个0,可以把0交换到 i 这个位置,再让cur++,就把这个非0元素包含在 [0, cur] 区域了,下图是模拟过程,可以参考理解

分类讨论:

  1. 遇到 0:直接 i++
  2. 遇到 1:swap(cur + 1,i),cur++,i++

 

代码: 

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int i = 0, cur = -1; i < nums.size(); ++i)
        {
            if (nums[i]) //非0元素
                //交换完cur+1后cur还要向后走,直接先自增
                swap(nums[++cur], nums[i]);
        }
    }
};

相关文章:

  • 一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
  • fps项目总结:角色组件
  • 【教程】使用docker+Dify搭建一个本地知识库
  • 《二分查找:一个数组的“自我修养”》
  • ubuntu20.04 使用nmcli 连接wifi,并且设置永久连接
  • 2025最新Python机器视觉实战:基于OpenCV与深度学习的多功能工业视觉检测系统(附完整代码)
  • redis小记
  • 在 Centos7 上部署 ASP.NET 8.0 + YOLOv11 的踩坑实录
  • AWS CLI将读取器实例添加到Amazon Aurora集群
  • 力扣-动态规划-746 使用最小花费爬楼梯
  • halcon三维点云数据处理(二十六)reduce_object_model_3d_to_visible_parts
  • 如何实现在Redis集群情况下,同一类数据固定保存在同一个Redis实例中
  • 5分钟使用Docker部署Paint Board快速打造专属在线画板应用
  • 从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?
  • 《Vue全栈图形绘制系统开发实战》—— 第一章础架构与核心模块实现
  • java项目之网络游戏交易系统源码(ssm+mysql)
  • 边缘计算:通俗易懂的全方位解析
  • 点云配准技术的演进与前沿探索:从传统算法到深度学习融合(1)
  • C/C++语言知识点二
  • 2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)
  • 我国成功发射中星3B卫星
  • 前列腺癌真的难以早发现吗?如何治疗?专家回应
  • 中方对美俄领导人就俄乌冲突进行通话有何评论?外交部回应
  • 新造古镇丨江浙沪重点打造的“水乡客厅”,古镇也能串着玩?
  • 钱进已任外交部新闻司副司长
  • 王毅同丹麦外交大臣会谈,表示在格陵兰问题充分尊重丹麦主权和领土完整