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