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

优选算法:移动零

题目链接

移动零

 

题目描述

 

核心思路

使用双指针法,通过两个指针(prev 和 cur)的配合,高效完成零元素的移动,时间复杂度为 O(n)(n 是数组长度),空间复杂度为 O(1)(仅使用常数级额外空间)。

  • cur:遍历指针,负责从头到尾扫描整个数组。
  • prev:记录非零元素的「待放置位置」,始终指向已处理部分的最后一个非零元素(初始化为 -1,表示尚未遇到非零元素)。

代码执行步骤

  1. 初始化指针cur = 0(从数组第一个元素开始遍历),prev = -1(初始无有效非零元素)。
  2. 遍历数组cur 从 0 到 nums.size() - 1 逐个移动:
    • 若 nums[cur] 是非零元素(if(nums[cur]),等价于 if(nums[cur] != 0)):
      • 先将 prev 向前移动一位(++prev),此时 prev 指向「下一个非零元素的放置位置」。
      • 交换 nums[prev] 和 nums[cur]:将当前非零元素 nums[cur] 放到 prev 位置,而原 prev 位置的元素(可能是零,也可能是之前未处理的非零元素)被交换到 cur 位置。
    • 若 nums[cur] 是零元素:不做操作,cur 继续向后移动。
  3. 遍历结束:所有非零元素已通过交换移动到数组前端,且保持相对顺序;零元素自然被「挤到」数组末尾。

示例演示

以数组 nums = [0, 1, 0, 3, 12] 为例,模拟执行过程:

步骤curnums[cur]prev操作(交换后数组)
100-1不操作,cur++
211(非零)-1 → 0交换 nums [0] 和 nums [1] → [1,0,0,3,12]
3200不操作,cur++
433(非零)0 → 1交换 nums [1] 和 nums [3] → [1,3,0,0,12]
5412(非零)1 → 2交换 nums [2] 和 nums [4] → [1,3,12,0,0]

最终结果:[1, 3, 12, 0, 0],符合预期。 

关键细节

  • 非零元素相对顺序不变:由于 cur 按顺序遍历,且每次交换都是将「当前非零元素」放到「前一个非零元素的下一位」,因此非零元素的相对顺序不会被破坏。
  • 交换的意义:当 prev 和 cur 不相等时,交换会将非零元素前移;当 prev == cur(如数组开头就是非零元素),交换相当于无操作,不影响结果。

 完整代码:

 

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

相关文章:

  • 激光雷达的单播和广播模式介绍
  • 2025年海外短剧独立站开发:H5+PC端双平台技术实践与增长策略
  • 处理HTTP请求体:精通`@RequestBody`、`@RequestHeader`与`@CookieValue`
  • 计算机视觉技术剖析:轮廓检测、模板匹配及特征点匹配
  • SpringBoot框架简介
  • Windows本地部署DeepSeek
  • git更新内核补丁完整指南
  • 【C++】使用中值滤波算法过滤数据样本中的尖刺噪声
  • Java 并发容器:ConcurrentHashMap 笔记(JDK 1.8)
  • 01_FOC学习之先让电机转动起来
  • 双紫擒龙紫紫红黄安装使用攻略,2025通达信指标源码,擒龙追踪源码公式学习
  • 爬虫基础概念
  • 浏览器访问[http://www.taobao.com](http://www.taobao.com/),经历了怎样的过程。
  • DNS域名解析过程
  • 通达OA二次开发
  • Impact rating 影响等级定义(学习笔记)
  • YOLOv8 剪枝模型加载踩坑记:解决 YAML 覆盖剪枝结构的问题
  • 【JAVA】使用vosk实现windows实时语音转文字,解放双手
  • vs2019 创建MFC ActiveX的详细步骤
  • JS事件基础
  • ESP-NOW无线通信协议:物联网设备间的高效对话方式
  • 前端基础知识Vue系列 - 24(axios的原理)
  • Linux(centos7)安装 docker + ollama+ deepseek-r1:7b + Open WebUI(内含一键安装脚本)
  • Windows下使用UIAutomation技术遍历桌面窗口和指定窗口内容的AutomationWalker.exe的C#源代码
  • QT元对象系统-(1)静态属性和动态属性
  • Jenkins配置与应用指南
  • 外贸公司经营步骤
  • AI赋能软件工程让测试左移更加可实施
  • 《C++》面向对象编程--类(下)
  • IPv6网络优化