这个题解使用了双指针的方法,通过维护三个指针p0, p2和i来将数组分成三个部分:[0, p0)表示已经排好序的0,(p2, len-1]表示已经排好序的2,[p0, i)表示已经扫描过的1。初始时p0和i都指向数组开头,p2指向数组末尾。然后用i来遍历数组,如果遇到0,就与p0位置交换,并将p0和i都右移一位;如果遇到2,就与p2位置交换,并将p2左移一位;如果遇到1,则直接将i右移一位。这样交换和移动指针直到i>p2,最后数组就按照0,1,2的顺序排好序了。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) < 2:
return
# [0, p0) = 0
# [p0, i) = 1
# (p2, len-1] = 2
p0 = 0
p2 = len(nums)-1
i = 0
while i <= p2:
if nums[i] == 0:
nums[p0], nums[i] = nums[i], nums[p0] # 遇到0,交换到p0位置
p0 += 1
i += 1
elif nums[i] == 1:
i += 1 # 遇到1,不做交换,指针后移
else:
nums[i], nums[p2] = nums[p2], nums[i] # 遇到2,交换到p2位置
p2 -= 1 # p2 左移,i不动,因为交换过来的元素还没处理过