LeetCode 283 - 移动零
思路
使用双指针法,一次遍历完成原地修改。
- 慢指针
slow
:指向下一个非零元素应该被放置的位置。 - 快指针
fast
:遍历整个数组,寻找非零元素。
当 fast
遇到非零数时,将其值赋给 slow
指向的位置,然后 slow
前进。fast
始终前进。
遍历结束后,slow
指针左侧(不含 slow
)都是排好序的非零元素。最后,将 slow
指针及之后的所有位置填充为 0
即可。
C++ 代码实现
class Solution {
public:void moveZeroes(vector<int>& nums) {int slow = 0;// 将所有非零元素移动到数组前面for (int fast = 0; fast < nums.size(); ++fast) {if (nums[fast] != 0) {nums[slow++] = nums[fast];}}// 将 slow 及其之后的位置填充为 0while (slow < nums.size()) {nums[slow++] = 0;}}
};
复杂度
- 时间复杂度:
O(n)
,fast
指针遍历数组一次。 - 空间复杂度:
O(1)
,原地操作,未使用额外空间。