官方题解:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(), left = 0, right = 0;//初始化变量 left用于追踪最后一个非零元素的位置 right用于遍历整个数组
while(right<n){ //遍历数组直接到数组末尾
if(nums[right]){ //检查当前指向元素是否为零 nums[right]不等于0
swap(nums[left],nums[right]); //如果right指针指向的元素是非零的,则交换
left++; //交换后指针向右移动一位,表示在当前位置之前的所有元素都是非零的
}
right++; //继续向前移动遍历完整个数组
}
}
};
示例:
假设输入数组为[0, 1, 0, 3, 12]
:
- 初始状态:
left = 0
,right = 0
- 第一次循环:
right
指向0,不做交换,right
指针移动到下一个位置,left
保持不变。left=0,right=1。 - 第二次循环:
right
指向1,交换nums[left]=0
和nums[right]=1
,得到[1, 0, 0, 3, 12]
,然后left
移动到1。 - 继续循环,直到
right
指针遍历完整个数组。 - 最终结果:
[1, 3, 12, 0, 0]
时间复杂度是O(n),因为每个元素都被访问了一次;
空间复杂度是O(1),因为它是在原地进行操作,不需要额外的空间。