news 2026/5/16 4:26:36

双指针1:移动零

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双指针1:移动零

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目描述

给定一个数组nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。注意:必须在不复制数组的情况下原地对数组进行操作。

示例

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

方法一:双指针交换法

思路

我们可以用一个指针left来记录当前非零元素应该放置的位置,然后遍历数组。当遇到非零元素时,就将它与left位置的元素交换,并让left指针右移。这样可以保证left指针之前的所有元素都是非零的,且保持了原有顺序。

代码实现

cpp

class Solution { public: void moveZeroes(vector<int>& nums) { int left = 0; for (auto& x : nums) { if (x != 0) { swap(x, nums[left]); left++; } } } };

复杂度分析

  • 时间复杂度:O (n),其中 n 是数组的长度。我们只需要遍历一次数组。
  • 空间复杂度:O (1),只使用了常数级的额外空间。

方法二:覆盖补零法

思路

  1. 先遍历数组,把所有非零元素依次覆盖到数组的前面,用一个变量stack_size记录当前覆盖的位置。
  2. 遍历完成后,stack_size及之后的位置全部补零即可。

代码实现

cpp

class Solution { public: void moveZeroes(vector<int>& nums) { int stack_size = 0; // 第一步:把非零元素移到前面 for (int x : nums) { if (x != 0) { nums[stack_size++] = x; } } // 第二步:后面的位置全部补零 while (stack_size < nums.size()) { nums[stack_size++] = 0; } } };

复杂度分析

  • 时间复杂度:O (n),两次遍历数组,总时间还是线性的。
  • 空间复杂度:O (1),同样是原地操作。

方法对比

方法优点缺点
双指针交换法只需一次遍历,操作次数更少交换操作会多写几次赋值
覆盖补零法逻辑直观,容易理解需要两次遍历,操作次数略多

在进阶要求 “尽量减少操作次数” 时,双指针交换法会更有优势。


总结

这道题的核心是原地修改保持相对顺序,两种方法都能满足要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 4:48:44

系统维护7个秘诀:如何彻底解决Windows性能瓶颈与空间不足问题

系统维护7个秘诀&#xff1a;如何彻底解决Windows性能瓶颈与空间不足问题 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 系统运行卡顿、磁盘空间告急、更新频繁…

作者头像 李华
网站建设 2026/4/30 4:07:33

纪元1800模组加载器:如何用工具解锁游戏新玩法?

纪元1800模组加载器&#xff1a;如何用工具解锁游戏新玩法&#xff1f; 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/5/2 12:58:03

解密AI文本检测:3大核心功能的真实性验证解决方案

解密AI文本检测&#xff1a;3大核心功能的真实性验证解决方案 【免费下载链接】detecting-fake-text Giant Language Model Test Room 项目地址: https://gitcode.com/gh_mirrors/de/detecting-fake-text 在人工智能快速发展的今天&#xff0c;AI生成文本与人类写作的界…

作者头像 李华
网站建设 2026/5/1 11:02:09

Axure RP多版本本地化配置指南:从需求分析到高效部署的系统方法

Axure RP多版本本地化配置指南&#xff1a;从需求分析到高效部署的系统方法 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包&#xff0c;不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-…

作者头像 李华
网站建设 2026/5/5 16:52:41

BERT语义理解天花板?400MB模型极限性能压测实战

BERT语义理解天花板&#xff1f;400MB模型极限性能压测实战 1. 什么是真正的“智能填空”&#xff1f; 你有没有试过这样一句话&#xff1a;“他做事总是很[MASK]&#xff0c;让人放心。” 输入后&#xff0c;AI不仅给出“靠谱”这个答案&#xff0c;还同时返回“稳重”&…

作者头像 李华
网站建设 2026/5/8 13:36:25

FSMN-VAD部署在ARM架构?树莓派实测可行性分析

FSMN-VAD部署在ARM架构&#xff1f;树莓派实测可行性分析 1. 为什么关心FSMN-VAD在树莓派上的运行能力 语音端点检测&#xff08;VAD&#xff09;是语音处理流水线里最基础也最关键的一步。它就像一个智能“语音开关”&#xff0c;能自动听出什么时候有人在说话、什么时候只是…

作者头像 李华