【双指针】LC 283.移动零

📅 2026/7/22 4:21:05
【双指针】LC 283.移动零
文章目录前言一、题目1、原题链接2、题目描述二、个人思路整理1、思路分析双指针解法非双指针解法2、解题代码双指针解法非双指针解法三、知识风暴前言本专栏文章为《LeetCode 热题 100》的刷题题解相关内容如有侵权立即删除。一、题目1、原题链接283.移动零2、题目描述二、个人思路整理1、思路分析双指针解法利用快慢指针快指针用来遍历整个数组慢指针用来维护非零数组核心做法快指针从前到后遍历原数组每当遇到非零元素就“放入到慢指针维护的数组”中具体操作交换快慢指针指向的元素然后慢指针后移当快指针遍历完即完成。为什么要交换参考https://leetcode.cn/problems/move-zeroes/solutions/489622/yi-dong-ling-by-leetcode-solution/comments/2173541/因为快指针只有指向非零元素时慢指针才移动。当数组中没有0时快慢指针始终指向同一个位置当数组中存在0时快指针比慢指针快慢指针指向的位置为0元素所以需要交换。非双指针解法仅维护非零数组下标指针对原数组进行原地覆盖当遇到非零元素时将元素覆盖到维护的非零数组中同时下标自增维护结束后下标指向的位置到原数组大小的末尾位置就是原数组中零的个数将这些位置覆盖为0即可。2、解题代码双指针解法classSolution{public:voidmoveZeroes(vectorintnums){intslow0;for(intfast0;fastnums.size();fast){if(nums[fast]!0){swap(nums[slow],nums[fast]);slow;}}}};非双指针解法classSolution{public:voidmoveZeroes(vectorintnums){intindex0;for(intnum:nums){if(num!0){nums[index]num;}}for(intiindex;inums.size();i){nums[i]0;}}};三、知识风暴在 C 中for (int num: nums)是一个 基于范围的 for 循环。这里的 fast 拿到的不是下标而是数组中具体元素的值。