283. 移动零

题目描述

思路
这道题目需要我们在不复制数组的情况下,原地对数组进行操作并完成"将零移动到数组的末尾,剩余的元素顺序不变"的操作,并且要求时间复杂度尽可能的低。我们可以使用双指针的思路来解决当前问题。
具体来说,我们设置一对快慢指针slow和fast,fast指针用于对数组进行遍历并寻找数组当中的非零元素,而slow指针指向的是下一个需要放置nums[fast]所对应的非零元素的位置。
开始遍历数组之后,我们需要判断nums[fast]当前所指的位置的值是否为0,如果不为零的话,我们就交换nums[slow]和nums[fast],并同时向后移动slow,原因是我们将slow指向的位置定义为下一个放置非零元素的位置。
显然,如果一个数组最开始的几个元素都是非零元素,则此时slow和fast会同时向后移动,值的交换操作实际上是无效的。只有当nums[fast]真正遍历到零元素的时候,slow才会停止移动,表明此时所指向的位置的元素是0,下一个fast遍历到的非零元素应该放置过来。
基于以上思路,我们写代码来解决问题。
Golang 题解
go
func moveZeroes(nums []int) {
slow, fast := 0, 0
n := len(nums)
for fast < n {
if nums[fast] != 0 {
nums[slow], nums[fast] = nums[fast], nums[slow]
slow ++
}
fast ++
}
}
Python 题解
python
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
slow, fast = 0, 0
while fast < len(nums):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
fast += 1