给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路
方法一:统计零元素
1.对数组遍历一次,遇到0时,count加1;
2.遇到非0时,记录当前位置是i,那么0的位置是i-count;
3.将非0元素换到0元素的位置。
代码
代码中count是记录0元素的个数,i-count实际上是记录了零元素的位置。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 循环记录0元素的个数,并且遇到非0元素时候,将非0元素替换到0元素的位置
# count 记录0元素的个数, i - count实际上是记录了零元素的位置。
count = 0
for i in range(len(nums)):
if nums[i] == 0:
count += 1
elif count > 0:
nums[i - count], nums[i] = nums[i], 0
return nums
时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作
方法二:双指针滑动,交换非零元素和零元素的位置
1.j为快指针,i为满指针;
2.当元素为0时,j加1,i保持不变;
3.当元素非0时,j加1,j和i位置的元素互换,并且i也加1。
代码
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 循环遍历数组,当遇到非零元素则开始交换慢指针所指的0元素
# i 为慢指针 指向最新一个0元素的位置
i = 0
for j in range(len(nums)):
if nums[j] != 0:
nums[i], nums[j] = nums[j], nums[i]
i += 1
return nums
时间复杂度:O(n)
空间复杂度:O(1)