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

LeetCode Hot100 - 4. 移动零(Java 题解)

LeetCode Hot100 - 4. 移动零(Java 题解)

题目链接

移动零 - LeetCode

难度

简单

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

说明

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解题思路

本题采用双指针(快慢指针) 解法,是最优解,满足原地修改、时间复杂度 O (n)。

核心思路:

  1. left 指针:指向当前应该放置非零元素的位置
  2. right 指针:遍历数组,寻找非零元素
  3. 遍历过程中,right 每找到一个非零元素,就与 left 位置交换,然后 left 右移;
  4. right 始终右移,直到遍历结束。
  5. 最终所有非零元素都被移动到数组左侧,0 全部在右侧,且非零元素相对顺序不变

复杂度分析

  • 时间复杂度:O(n)

    只遍历一次数组。

  • 空间复杂度:O(1)

    原地修改数组,仅使用常数额外空间。

解题代码(Java)

class Solution {public void moveZeroes(int[] nums) {// left:存放非零元素的位置// right:遍历数组的指针int left = 0, right = 0, length = nums.length;for (int i = 0; i < length; i++) {// 遇到非零元素,交换到 left 位置if (nums[i] != 0) {swap(nums, left, right);left++; // 下一个非零元素放在下一位}right++; // 遍历指针一直前进}}// 交换数组中两个下标的元素public void swap(int[] nums, int left, int right) {int temp = nums[right];nums[right] = nums[left];nums[left] = temp;}
}

代码解释

  1. 双指针定义

    • left:记录下一个非零元素要存放的下标。
    • right:遍历整个数组,寻找非零元素。
  2. 核心逻辑

    遍历数组,只要找到非零数,就把它交换left 指向的位置,保证非零元素按顺序排列。

  3. swap 方法

    原地交换两个元素,不占用额外数组空间。

  4. 遍历结束

    所有非零元素都在左侧,0 被挤到数组末尾,完成要求。

示例演示

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

执行过程:

  • right=0,值为 0 → 不交换,right++
  • right=1,值为 1 → 交换 left=0 和 right=1 → [1,0,0,3,12],left=1
  • right=2,值为 0 → 不交换,right++
  • right=3,值为 3 → 交换 left=1 和 right=3 → [1,3,0,0,12],left=2
  • right=4,值为 12 → 交换 left=2 和 right=4 → [1,3,12,0,0],left=3

输出:[1,3,12,0,0]

易错点

  1. 必须原地修改,不能新建数组。
  2. 要保持非零元素的相对顺序,不能乱序。
  3. 双指针一定要先交换再移动 left,right 全程移动。
  4. 不要用额外空间,否则不是最优解。

总结

本题是经典双指针(快慢指针) 入门题,思路简单、代码优雅,面试常考。

核心思想:用指针标记非零元素位置,遍历交换,实现原地移动零。

http://www.jsqmd.com/news/636050/

相关文章:

  • 009、Python流程控制:条件判断(if/elif/else)
  • 函数用法记录——MATLAB符号计算
  • uniapp Uview框架中u-search组件实现动态搜索与数据过滤
  • Tiktokenizer高性能架构设计:深入解析Token可视化引擎的实现原理
  • WPF DataContext实战:三种绑定方式深度解析
  • 构建“私有第二大脑”:基于 Graph-RAG 的本地知识图谱 Agent 搭建指南
  • OpenClaw:AI Agent引擎驱动的企业全流程智能助手
  • “一眼识万物”:用Rokid AI Glasses与灵珠平台打造植物百科助手
  • AIAgent为何总“好心办坏事”?SITS2026首席科学家解密价值对齐的5个隐性断层及实时干预协议
  • mPDF终极指南:PHP PDF生成库的深度技术解析与实战应用
  • 【RJ 45连接器】RJ45 网络连接器 3D 模型 3 零件装配体 SolidWorks 源文件 含 STEP/IGS 通用格式
  • Python 函数完全指南:参数、返回值与高级用法
  • 告别模糊截图:html-to-image 终极高清图像生成指南
  • PCILeech DMA攻击工具深度实战指南:掌握无驱动内存取证核心技术
  • 网络攻防实践五 20252901程宇
  • 终极指南:使用icloudpd命令行工具轻松备份你的iCloud照片库
  • OpCore Simplify终极指南:三分钟完成黑苹果完美配置
  • 运维怎么转行网络安全?(非常详细)从零基础入门到精通,收藏这一篇就够了
  • Python GUI程序怎么避免卡顿_利用多线程实现后台异步处理
  • C++ string类
  • 360Controller:macOS平台Xbox游戏控制器驱动深度解析与实战指南
  • 如何通过Java程序监控Oracle表空间_JDBC定时执行巡检SQL并推送报警指标
  • 别急着换卡!双T4虚拟机掉卡报错RmInitAdapter failed,我的排查思路和重启大法复盘
  • Chinook数据库:一站式多数据库平台教学与测试解决方案
  • FOC电流采样实战:从采样电阻到ADC的完整信号链设计
  • 3步解锁B站AI视频总结:让学习效率飙升300%的秘密武器
  • Palantir实战指南:单细胞转录组拟时分析的Python实现与优化
  • 重新定义Windows字体个性化:No!! MeiryoUI深度解析与使用指南
  • AI元人文:意义行为原生论的发生学阐明与伦理中间件建构
  • 别再用RAG硬凑了!:用知识图谱原生支撑AIAgent决策流——从Schema建模、实体对齐到因果推理的全链路工程实践