记录非零元素本应存放位置,将非零元素向前移动,最后补上相应的零
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int index = 0;//记录非零元素应该存在位置的下标
for(int i = 0; i < nums.size(); i++){
//将非零元素向前移动
if(nums[i] != 0){
nums[index++] = nums[i];
}
}
//剩余位置补零
for(int j = index; j < nums.size(); j++){
nums[j] = 0;
}
}
};
优化后的算法(明确定义使用双指针)
左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部
注意到以下性质:
-
左指针左边均为非零数;
-
右指针左边直到左指针处均为零
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++;//更新待处理序列头部指针,即右指针位置
}
}
};