题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
要求:
只能在原有数组上进行操作,不能新建额外的数组。
分析
这一题的难点有两个:
1.结果要保持非0元素的相对顺序
2.不能新建额外的数组
解法一:快慢指针
def solution(nums):
n = len(nums)
# 定义慢指针初始索引
slow_index = 0
for i in range(n):
# 如果是非0元素,那就把它覆盖到慢指针的位置,同时慢指针+1
if nums[i] != 0:
nums[slow_index] = nums[i]
slow_index += 1
# 对于慢指针之后的元素,都替换为0
for j in range(slow_index+1, n):
nums[j] = 0
解法二:快慢指针(优化版)
思考解法一,其实我们还有更快的方法。
遍历一遍数组,遇到非0元素就把它和慢指针处的值进行交换
快指针:用于找出非0元素
慢指针:用于记录非0元素应该存放的位置
在纸上画一画不难得出,快慢指针只有如下两种情况:
- 刚开始快慢指针是相等的,指向同一位置,此时 该位置如果是非0元素,那就自己和自己交换,若该位置是 0元素,那慢指针就保持不动,快指针继续遍历,找到非0元素之后,再把它和慢指针处的元素进行交换。
- 快慢指针不想等时,慢指针指向的必然是0元素。(因为非0元素都已经被快指针找出来替换到前面去了,可以自己画一画)
直接上代码:
def solution(nums):
# 定义慢指针初始索引
slow_index = 0
for fast_index in range(len(nums)):
# 如果是非0元素
if nums[fast_index] != 0:
# 交换快慢指针位置的元素
nums[slow_index], nums[fast_index] = nums[fast_index], nums[slow_index]
# 慢指针向前移一位
slow_index += 1