Leetcode-移动零(双指针)

105 阅读3分钟

双指针

双指针是一种通过设置两个指针不断进行单向移动来解决问题的算法思想。

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        left = right = 0
        for right in range(n):
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1

left 指针: 用于指向当前已经处理好的序列的尾部,左侧的元素都是非零的。

right 指针: 用于遍历整个数组,找到非零元素并将其与 left 指针指向的位置交换。

假设输入数组为 [0, 1, 0, 3, 12]

  1. 初始状态:

    • left = right = 0
  2. 第一次迭代:

    • right 指向 0,因为它是零,所以不执行交换操作,right 向右移动。
    • left 不变。
  3. 第二次迭代:

    • right 指向 1,因为它不是零,所以将 nums[left]nums[right] 交换。

      • 数组变为 [1, 0, 0, 3, 12]
    • left 向右移动,指向下一个位置。

  4. 第三次迭代:

    • right 指向第二个 0,因为它是零,所以不执行交换操作,right 向右移动。
    • left 不变。
  5. 第四次迭代:

    • right 指向 3,因为它不是零,所以将 nums[left]nums[right] 交换。

      • 数组变为 [1, 3, 0, 0, 12]
    • left 向右移动,指向下一个位置。

  6. 第五次迭代:

    • right 指向 12,因为它不是零,所以将 nums[left]nums[right] 交换。

      • 数组变为 [1, 3, 12, 0, 0]
    • left 向右移动,指向下一个位置。

  7. 遍历结束:

    • right 到达数组的末尾。

image.png

动态演示