返回

巧妙解决「双指针」难题:LeetCode 283. 移动零(简单)

前端

在算法的世界中,双指针技巧 是一种巧妙的方法,它利用两个指针同时遍历数组或其他数据结构,以解决各种问题。今天,我们深入探讨 LeetCode 上经典的「双指针」难题 283. 移动零,并深入了解其解决之道。

理解题目

在 LeetCode 283. 移动零中,我们的目标是给定一个数组 nums ,将其中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。也就是说,在移动零之后,所有非零元素应保持它们在原始数组中的位置关系。

应用双指针技巧

要解决这个问题,我们可以采用双指针技巧。我们定义两个指针 slowfast ,它们都从数组的开头开始。slow 指针负责跟踪非零元素的当前位置,而 fast 指针负责遍历数组并查找下一个非零元素。

我们按照以下步骤进行:

  1. slowfast 指针都初始化为 0。
  2. 遍历数组,使用 fast 指针查找下一个非零元素。
  3. 如果 fast 指针找到非零元素,则将该元素交换到 slow 指针指向的位置。
  4. slowfast 指针都向前移动一位。
  5. 重复步骤 2-4,直到 fast 指针到达数组末尾。

代码实现

def move_zeros(nums):
    slow = 0
    fast = 0

    while fast < len(nums):
        if nums[fast] != 0:
            nums[slow] = nums[fast]
            slow += 1
        fast += 1

    # 将剩余的 0 移动到数组末尾
    while slow < len(nums):
        nums[slow] = 0
        slow += 1

复杂度分析

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。双指针技巧遍历数组一次,因此时间复杂度为 O(n)。
  • 空间复杂度: O(1),因为我们没有使用额外的空间。

实例

考虑以下示例:

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

步骤分解:

  • fast 指针找到第一个非零元素 1,将其交换到 slow 指针指向的位置。
  • slowfast 指针都向前移动一位。
  • fast 指针找到第二个非零元素 3,将其交换到 slow 指针指向的位置。
  • slowfast 指针都向前移动一位。
  • fast 指针找到第三个非零元素 12,将其交换到 slow 指针指向的位置。
  • slowfast 指针都向前移动一位。
  • fast 指针到达数组末尾。
  • 将剩余的 0 移动到数组末尾。

结论

双指针技巧在解决「双指针」难题中发挥着至关重要的作用,它提供了一种简洁高效的方法来解决该问题。通过熟练掌握双指针技巧,我们可以解决一系列其他算法问题。在探索算法世界的旅程中,双指针技巧是一个宝贵的工具,它将极大地提升你的问题解决能力。