双指针
双指针是一种通过设置两个指针不断进行单向移动来解决问题的算法思想。
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
n = len(nums)
left = right = 0
for right in range(n):
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
left 指针: 用于指向当前已经处理好的序列的尾部,左侧的元素都是非零的。
right 指针: 用于遍历整个数组,找到非零元素并将其与 left 指针指向的位置交换。
假设输入数组为 [0, 1, 0, 3, 12]。
-
初始状态:
left = right = 0
-
第一次迭代:
right指向0,因为它是零,所以不执行交换操作,right向右移动。left不变。
-
第二次迭代:
-
right指向1,因为它不是零,所以将nums[left]和nums[right]交换。- 数组变为
[1, 0, 0, 3, 12]
- 数组变为
-
left向右移动,指向下一个位置。
-
-
第三次迭代:
right指向第二个0,因为它是零,所以不执行交换操作,right向右移动。left不变。
-
第四次迭代:
-
right指向3,因为它不是零,所以将nums[left]和nums[right]交换。- 数组变为
[1, 3, 0, 0, 12]
- 数组变为
-
left向右移动,指向下一个位置。
-
-
第五次迭代:
-
right指向12,因为它不是零,所以将nums[left]和nums[right]交换。- 数组变为
[1, 3, 12, 0, 0]
- 数组变为
-
left向右移动,指向下一个位置。
-
-
遍历结束:
right到达数组的末尾。