LeetCode 移动零(双指针+图解)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

思路分析:使用两个指针,一个指针扫描数组,一个指针用于指向移动好的非零序列的尾端。
图解示例
LeetCode 移动零(双指针+图解)_第1张图片
LeetCode 移动零(双指针+图解)_第2张图片
LeetCode 移动零(双指针+图解)_第3张图片
LeetCode 移动零(双指针+图解)_第4张图片

class Solution {
public:
	void moveZeroes(vector& nums) {
		int numsSize = nums.size();
		int firstPtr = 0;//这个指针指向非零序列的末端
		//扫描数组,将所有的非零元素依次移动到firstPtr,并实时更新firstPtr
		for (int i = 0; i < numsSize; ++i) {
			if (nums[i] != 0) {//如果这个元素非零
                //判断它是否在非零元素序列的尾端
                if (firstPtr != i){//如果不是在非零元素序列的尾端,则需要移动
                    nums[firstPtr++] = nums[i];
                    nums[i] = 0;//移动之后需要进行擦除
                }
				else{//如果是在尾端,则直接将非零序列的尾端指针后移即可,无需后移
                    firstPtr += 1;
                }
			}
		}
	}
};

LeetCode 移动零(双指针+图解)_第5张图片

你可能感兴趣的:(LeetCode)