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

力扣 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),原地交换。


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

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

相关文章:

  • 深度学习--神经网络的构造
  • AI核心概念之“提示(Prompt)” - 来自DeepSeek
  • Python字符串操作全解析:从基础到高阶应用
  • mysql关联查询语句
  • C/C++条件判断
  • 混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
  • flutter doctor 信号号超时
  • CCF CSP 第36次(2024.12)(1_移动_C++)
  • 基于STM32、HAL库的TCA9555PWR I/O扩展器驱动程序设计
  • linux如何用关键字搜索日志
  • 学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)
  • 【微信小程序】报错: http://127.0.0.1:7001 不在以下 request 合法域名列表中
  • 危化品安全员考试常见与注意事项
  • Python GUI 编程 | QPushButton 按钮控件详解 — 边框扁平化
  • virt-install和libguestfs工具常用虚拟机管理命令
  • Oracle REGEXP_SUBSTR
  • LINUX基石
  • 今日一记:五人分鱼与医院值班推理
  • 每日一题(小白)暴力娱乐篇30
  • 简单socket通信,回显 服务器程序与客户端程序之间的通信。
  • 特朗普的百日执政支持率与他“一税解千愁”的世界观和方法论
  • 中国海警局新闻发言人就菲律宾非法登临铁线礁发表谈话
  • 中青报:“猿辅导员工猝死”事件上热搜,是对健康职场环境的共同关切
  • 龚曙光:散文家永远只有一个视角,就是“我与时代”
  • 长三角数智文化产业基金意向签约会成功举办
  • 由重商主义观察世界现代化历程