move-zeroes
283. 移动零
题解
使用两个指针,例如 pa,和 pb,根据不同的状态采用不同的处理即可。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
const int n = nums.size();
int pa = 0;
int pb = 0;
while(pb<n){
if(nums[pa]!=0){
pa++;
pb++;
continue;
}
if(nums[pb]==0){
pb++;
continue;
}
nums[pa] = nums[pb];
nums[pb] = 0;
pa++;
pb++;
}
}
};
官方的题解更简洁:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(), left = 0, right = 0;
while (right < n) {
if (nums[right]) {
swap(nums[left], nums[right]);
left++;
}
right++;
}
}
};
如果数组没有 0,那么快慢指针始终指向同一个位置,每个位置自己和自己交换;如果数组有 0,快指针先走一步,此时慢指针对应的就是 0,所以要交换。