1.题目描述
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums
should be [1, 3, 12, 0, 0]
.
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
2.解题思路
两个序号z和nz,初始化为0
nz保存的是当前已经确认的,移动到前方的最后一个非零元素的位置。
z是当前扫过的地方。
我们用z扫一遍数组:
如果z扫到一个非零元素,就搬到nz指示的位置,同时当前位置置0,而且nz++,z++
如果z扫到0,那么就继续扫。
由于只是扫过一次数组,所以复杂度是O(N)
3.实现代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int nz=0,z=0;
while(z<nums.size()){
if(nums[nz]==0){
while(z<nums.size()&&nums[z]==0)
++z;
//找到非零
if(z!=nums.size()){
nums[nz]=nums[z];
nums[z]=0;
}
} else{
if(z==nz)
++z;
++nz;
}
}
}
};