Skip to main content

283.移动零

标签: array, two-pointers

难度: Easy

通过率: 62.34%

原题链接: https://leetcode.com/problems/move-zeroes/description/

题目描述

给定一个整数数组 nums,请将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下就地完成操作。

解题思路

我们可以使用两个指针来解决这个问题,一个指针用于遍历整个数组,另一个指针 insertPos 用于记录下一个非零元素应该存放的位置。遍历数组时,当发现一个非零元素时,就将该元素移动到 insertPos 的位置,同时将 insertPos 向前推进一位。遍历完成后,所有的非零元素都被移到了数组的前部分,接着我们将 insertPos 后面的元素全部置零即可。

代码实现

def moveZeroes(nums):
# 初始化下一个非零元素应该存放的位置
insertPos = 0
# 遍历整个数组
for num in nums:
if num != 0:
# 若元素不为零,将其放到下一个非零位置
nums[insertPos] = num
# 更新下一个非零位置
insertPos += 1
# 将剩余部分填充为零
for i in range(insertPos, len(nums)):
nums[i] = 0

复杂度分析

时间复杂度为 O(n)O(n),其中 nn 为数组的长度,因为我们进行了两次线性遍历。

空间复杂度为 O(1)O(1),因为我们只使用了常数个额外空间来存储变量。