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.
Example:
Input:[0,1,0,3,12]
Output:[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
思路:
设置双指针slow和fast,fast每次都递增,当遍历到不是0的时候,slow指针就存储fast此时遍历的元素,slow加一,当遍历到需要删除的元素0时,略过slow,直接fast++,相当于删除了0.同时设置一个变量记录新数组的长度。最后我们再遍历剩下的元素,并给他们赋值为0即可。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int fast,slow = 0;
int n = nums.size();
while(fast < n){
if(nums[fast] !=0){
nums[slow] = nums[fast];
++slow;
}
++fast;
}
for(int i = slow;i < n; i++){
nums[i] = 0;
}
}
};
看到的另外一种写法,但是原理相同:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
for(int i = 0,j = 0;i < n;i++){
if(nums[i]){
swap(nums[i],nums[j++]);
}
}
}
};