LeetCode 补拙笔记0. 前言日期2026.06.07题目283. 移动零难度简单标签数组、双指针1. 题目理解问题描述给定一个数组nums将所有0移动到数组的末尾同时保持非零元素的相对顺序。必须在原地对数组进行操作不允许复制数组。示例输入nums [0,1,0,3,12]输出[1,3,12,0,0]2. 解题思路核心观察非零元素的相对顺序必须保持不变因此可以用双指针实现一个慢指针j指向“下一个非零元素应该存放的位置”一个快指针i遍历数组遇到非零元素就和j位置的元素交换然后j。这种方法能保证非零元素的相对顺序不变且所有操作在原地完成。算法步骤初始化慢指针j 0遍历数组若nums[i] ! 0则交换nums[i]和nums[j]交换后j遍历结束所有非零元素已移至数组前部零元素自然落在末尾。3. 代码实现packagelc283;classSolution{publicvoidmoveZeroes(int[]nums){intj0;for(inti0;inums.length;i){if(nums[i]!0){inttempnums[i];nums[i]nums[j];nums[j]temp;j;}}}}4. 代码优化说明classSolution{static{// 预热代码优化首次运行性能SolutionsnewSolution();int[]t{1};for(inti0;i500;i){s.moveZeroes(t);}}publicvoidmoveZeroes(int[]nums){// zeroIndex 记录当前第一个0的位置intzeroIndex-1;intlennums.length;for(inti0;ilen;i){if(nums[i]!0){// 如果前面存在0则将当前非零元素移动到第一个0的位置if(zeroIndex0){nums[zeroIndex]nums[i];nums[i]0;// 更新第一个0的位置向后寻找下一个0for(intjzeroIndex1;ji;j){if(nums[j]0){zeroIndexj;break;}}}}else{// 遇到第一个0时记录位置if(zeroIndex-1){zeroIndexi;continue;}}}}}5. 复杂度分析双指针交换法基础版时间复杂度O(n)O(n)O(n)每个元素最多被访问一次。空间复杂度O(1)O(1)O(1)原地操作仅使用常数额外空间。优化版单指针查找下一个0时间复杂度最坏情况下为O(n2)O(n^2)O(n2)全零数组但实际运行中常数优化明显性能表现通常优于基础版。空间复杂度O(1)O(1)O(1)原地操作。6. 总结核心思路利用双指针在原地完成非零元素的“前移”同时保持其相对顺序。优化点避免不必要的交换仅在当前元素非零且前面存在零时才进行移动提前预热JVM通过静态代码块减少首次运行的性能开销减少if分支逻辑更紧凑提高执行效率。关键技巧j指针只在遇到非零元素时移动保证了非零元素的相对顺序不变。