Skip to content

283. 移动零 Easy

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

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

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

示例 2:
输入: nums = [0]
输出: [0]

解题思路

输入:一个数组 nums

输出:将 0 移动到数组的末尾,同时保持相对顺序

本题属于 快慢指针 问题。

我们可以用一个慢指针指向第一个数,不论是否是 0

再用一个快指针从头遍历数组,当快指针为非0的数时(包含快慢指针为同一个数),交换快慢指针的值,交换后移动慢指针

由于快指针遇到 0 会跳过,所以一定会出现快指针走在慢指针的前面,慢指针就停在了 0 上,此时交换数字就是将 0 移动到快指针的位置

代码实现

python
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        left = 0  # 慢指针,指向下一个应该放非零元素的位置

        # right 为快指针,从头到尾遍历数组
        for right in range(len(nums)):
            # 只有当当前元素不为 0 时才处理
            if nums[right] != 0:
                # 交换当前位置 right 和 left 的元素
                # 这样非零元素被放到 left 位置,原来 left 位置的 0 被移到 right
                nums[left], nums[right] = nums[right], nums[left]
                
                # 移动慢指针,准备放下一个非零元素
                left += 1
javascript
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let left = 0;

    for (let right in nums) {
        if (nums[right] !== 0) {
            [nums[left], nums[right]] = [nums[right], nums[left]]
            left ++;
        }
    }
};

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

链接

283 国际版

283 中文版