给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
法一:统计0元素
nums=[1,2,0,3,9,0,]
def MoveZeroes(self):
"""
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
output=MoveZeroes(nums)
print(output)
复杂度分析:时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作
法二:双指针滑动,交换非零元素和零元素的位置
class Solution:
def moveZeroes(self,arg) :
# 循环遍历数组,当遇到非零元素则开始交换慢指针所指的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
nums=[1,2,0,3,9,0]
output=Solution()
print(output.moveZeroes(nums))
>>>[1, 2, 3, 9, 0, 0]
改成[1, 2, 8, 3, 9, 0]
print一下打印出中间的num[i],num[j]可得
2
1
======
8
2
======
3
8
======
9
3
======
0
9
======
0
0
======
[1, 2, 8, 3, 9, 0]
Process finished with exit code 0
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作
法三:非零元素替换零元素法
class Solution:
def moveZeroes(self,arg) :
# 循环遍历数组,当遇到非零元素则开始交换慢指针所指的0元素
# i 为慢指针 指向最新一个0元素的位置
j = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[j] = nums[i]
if i != j:
nums[i] = 0
j += 1
print(nums[i])
print(nums[j])
print('======')
return nums
nums=[1,2,8,3,9,0]
output=Solution()
print(output.moveZeroes(nums))
>>>
1
2
======
2
8
======
8
3
======
3
9
======
9
0
======
0
0
======
[1, 2, 8, 3, 9, 0]
但凡中间出现0 就会后面全部变成0
如:
2
1
======
0
2
======
0
0
======
0
0
======
0
0
======
0
0
======
[1, 2, 3, 9, 0, 0]
时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作