快捷搜索: 王者荣耀 脱发

LeetCode 283. 移动零 | Python

283. 移动零


题目


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

示例:

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

说明:

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

解题思路


思路:双指针

在站内(力扣),这道题中其实已经给了思路。

提示 2:

A two-pointer approach could be helpful here. The idea would be to have one pointer for iterating the array and another pointer that just works on the non-zero elements of the array.

提示中说明,可以考虑使用双指针的方法。

先审题,题中给定一个数组 nums,要求编写函数将所有的 0 移动到数组末尾,而其他非零的元素保持相对顺序。题目要求使用在原数组上操作,不使用额外的数组。

那么这里说一下双指针思路的做法:

    定义双指针 l e f t left left、 r i g h t right right,初始指向数组的头部; 移动 r i g h t right right 指针开始遍历数组,观察 r i g h t right right 指针对应的元素: 如果 r i g h t right right 指向的元素数值为 0 0 0 时,继续移动指针; 若数值非 0 0 0 时,交换 l e f t left left、 r i g h t right right 两指针对应的数,两指针均向右移动。 当 r i g h t right right 指针到达数组末尾时,遍历结束。

上面方法执行遍历数组时,因为 r i g h t right right 指向元素数值为 0 0 0 时,不执行交换操作直接移动指针,而 l e f t left left 指针此时是没有移动的,也就是说 l e f t left left 会停留在 0 0 0 处等待交换。

而 r i g h t right right 指向元素数值非 0 0 0 时,与 l e f t left left 对应的元素进行交换,每次交换的都是 l e f t left left 指针的零和 r i g h t right right 指针的非零元素,所以相对顺序不会发生变化。

具体的代码实现如下。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        # 定义指针
        left = 0
        right = 0
        # 开始遍历
        while right < n:
            # right 指针指向元素数值非 0 时,交换元素
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
            right += 1


如有错误,烦请指出,欢迎指点交流。

经验分享 程序员 微信小程序 职场和发展