力扣 283 移动零的两种高效解法详解

目录

方法一:两次遍历法

方法二:单次遍历交换法

两种方法对比


在解决数组中的零移动到末尾的问题时,我们需要保持非零元素的顺序,并原地修改数组。以下是两种高效的解法及其详细分析。


方法一:两次遍历法

思路分析

  1. 第一次遍历 :将所有非零元素移动到数组前端。使用指针 j 记录非零元素应插入的位置。遍历数组时,遇到非零元素就将其放到 nums[j],然后 j 递增。

  2. 第二次遍历 :将 j 之后的位置全部填充为零。

代码实现

复制代码
var moveZeroes = function(nums) {
    let j = 0;
    // 将非零元素移到前面
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0) {
            nums[j] = nums[i];
            j++;
        }
    }
    // 剩余位置填零
    for (let i = j; i < nums.length; i++) {
        nums[i] = 0;
    }
    return nums;
};

示例解析

  • 输入 [0, 1, 0, 3, 12]

    • 第一次遍历后,非零元素 1, 3, 12 被移到前三位,j = 3

    • 第二次遍历从索引3开始填零,结果为 [1, 3, 12, 0, 0]

复杂度

  • 时间复杂度:O(n),两次独立遍历。

  • 空间复杂度:O(1),仅使用常量空间。


方法二:单次遍历交换法

思路分析

  • 使用双指针 i(遍历数组)和 j(标记待插入位置)。当 nums[i] 非零时,将其与 nums[j] 交换,并递增 j

  • 此方法通过交换操作,逐步将非零元素移到前面,零被交换到后面。

代码实现

复制代码
var moveZeroes = function(nums) {
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0) {
            if (i !== j) { // 避免不必要的原地交换
                [nums[j], nums[i]] = [nums[i], nums[j]];
            }
            j++;
        }
    }
    return nums;
};

示例解析

  • 输入 [0, 1, 0, 3, 12]

    • i=0,元素为0,跳过。

    • i=1,元素1,交换到 j=0,数组变为 [1, 0, 0, 3, 12]j=1

    • i=3,元素3,交换到 j=1,数组变为 [1, 3, 0, 0, 12]j=2

    • i=4,元素12,交换到 j=2,最终结果为 [1, 3, 12, 0, 0]

复杂度

  • 时间复杂度:O(n),仅一次遍历。

  • 空间复杂度:O(1),原地交换。


两种方法对比
方法 优点 缺点
两次遍历法 逻辑简单,直接覆盖 需要额外填零的步骤
单次遍历交换法 一次遍历完成,更高效 交换操作可能稍慢

总结

两种方法均满足题目要求,选择依据具体场景。若数组零较多,两次遍历法可能更优;若零较少,交换法更高效。两种方法均保证了非零元素的顺序,且原地操作,符合题目要求。

相关推荐
小明同学012 分钟前
[C++入门]简化的艺术---对模版的初步探索
开发语言·c++·算法
kaiaaaa1 小时前
算法训练第八天
算法
LL_xjbt1 小时前
代码随想录刷题day29
算法·leetcode·动态规划
叶子2024221 小时前
守护进程实验——autoDL
人工智能·算法·机器学习
半桔2 小时前
【算法深练】分组循环:“分”出条理,化繁为简
数据结构·c++·算法·leetcode·面试·职场和发展
天天爱吃肉82182 小时前
【十年技术演进深度解构:车载充电机(OBC)将成为新能源汽车的“能源大脑”】
python·嵌入式硬件·算法·汽车·能源
KerwinChou_CN2 小时前
自由开发者计划 004:创建一个苹果手机长截屏小程序
图像处理·算法·智能手机·小程序
Kethy__2 小时前
算法分析与设计-动态规划、贪心算法
c++·学习·算法·贪心算法·动态规划
闪电麦坤953 小时前
数据结构:递归:泰勒展开式(Taylor Series Expansion)
数据结构·算法
Humbunklung9 小时前
Rust 控制流
开发语言·算法·rust