移动零---双指针

https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked

       移动零---双指针_第1张图片 

        将零元素移动到数组尾部,非零元素的相对位置不变。

         这种找特殊数据,并且其他数据相对位置不变的问题,就可以用双指针实现。

        类似我们写的快排的前后指针法一样,一个指针找小,找到小就和另一个指针位置的值交换,直到找小指针越界,这里是同样的思路。

        由于我们最终要将非零的元素放在左边,所以我们就用一个指针去找非零元素,找到非零元素,我们就和另一个指针的位置值交换,然后另一个指针朝下走一步,走到下一个0元素的位置,一个指针继续找非零元素,直到越界。

移动零---双指针_第2张图片

        如图,代码实现如下:

void Swap(int* a, int* b) {
    int c = *a;
    *a = *b;
    *b = c;
}
void moveZeroes(int* nums, int numsSize) {
    int Zero = 0;
    int NoZero = 0;

    // NoZero去找非零
    while (NoZero < numsSize) {
        if (nums[NoZero] != 0)
            Swap(&nums[Zero++], &nums[NoZero]);
        NoZero++;
    }
}

 

你可能感兴趣的:(双指针OJ题,双指针)