引言
今天,看到了一个双指针算法,构思非常巧妙。这里特来记录一下。
正文
本题,我们使用两个指针,一左一右,右侧指针不断向右侧移动,如果右侧指针所指向的数据值不为 0
,那么我们就交换右侧指针和左侧指针的数据,且左侧指针向右侧位移一个位置。这样就可以将所有不为 0
的元素按照顺序放置到左指针的左侧。遇到右侧指针指向元素为 0
的情况,我们不做任何操作,继续将右侧指针向右侧位移一个元素。直至右侧指针抵达最后一个元素位置处结束。通过这种方法,就可以将为 0 的元素统一位移到左侧指针的右侧。最终左侧指针位置的左侧全部为 0
, 右侧全部不为 0
。
from typing import List
def move_list_element(nums: List[int]):
left = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[left], nums[i] = nums[i], nums[left]
left += 1
return nums
if __name__ == '__main__':
nums_ = [0, 1, 0, 3, 12]
result = move_list_element(nums_)
print(result)
"""
[1, 3, 12, 0, 0]
"""
上述代码中的 left
表示左指针,i
表示右指针。
对于双指针,最清晰的写法是使用 while
循环。如下:
from typing import List
def move_list_element(nums: List[int]):
left = 0
right = 0
n = len(nums)
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
return nums
if __name__ == '__main__':
nums_ = [0, 1, 0, 3, 12]
result = move_list_element(nums_)
print(result)
"""
[1, 3, 12, 0, 0]
"""
如果大家觉得有用,就请点个赞吧~