双指针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),同样是原地操作。

方法对比

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

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


总结

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

相关推荐
心运软件5 小时前
银行客户流失预测(Python 完整实战)
算法
邪神与厨二病5 小时前
牛客周赛 Round 153
python·算法
TlSfoward5 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记5 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-07-21
搜索引擎·百度
RD_daoyi6 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
ApacheSeaTunnel6 小时前
Apache SeaTunnel AI CLI Benchmark:7 款大模型、100 个 ETL 任务实测,谁真正能跑起来?
大数据·ai·开源·大模型·数据集成·cli·seatunnel·技术分享·数据同步
电商API_180079052477 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
qizayaoshuap7 小时前
# ❌ 井字棋 — 鸿蒙ArkTS Minimax AI算法与博弈系统设计
人工智能·算法·华为·harmonyos
小稻穗7 小时前
市场调研样本选型坐标系:2026六家国内样本平台能力横向校验
大数据·运维·数据分析