答案:
class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ p0, cur, p2 = 0, 0, len(nums)-1 while cur <= p2: if nums[cur] == 0: nums[p0], nums[cur] = nums[cur], nums[p0] p0 += 1 cur += 1 elif nums[cur] == 2: nums[cur], nums[p2] = nums[p2], nums[cur] p2 -= 1 #这个时候,不移动指针cur,因为 else: cur += 1
为什么当数字=2的时候,不移动指针。明天再来想想具体的原因。
原因,因为我们的cur指针从左往右移动,左边之前的元素一定是0。假设cur和右指针交换位置之后,交换过来的也是2,如果我们cur向后移动了,那么中间就会有2的元素,无法将所有的2都移动到最右端。2将会出现在cur的左边。
however,我们如果cur指向的是0,假设交换过来的也是0,cur往后移动,这完全没关系,因为我们正需要0在cur的后面。
这个双指针的方法很难想到,需要极高的智慧。