classSolution:defsortColors(self, nums: List[int])->None:"""
Do not return anything, modify nums in-place instead.
"""# 思路:提示了只使用常数空间一次扫描,明显是多指针法三指针,左指针用来存放0,右指针用来存放2,中指针用来找0和2# 本题还可以使用哈希表存储三个元素出现的次数,然后再输出数组,哈希表可以用数组或者字典模拟# 或者多趟扫描:第一趟扫描0,用一个指针储存并且记录第二趟的起点,第二趟扫描1
left ,mid =0,0
right =len(nums)-1for i inrange(right+1):if nums[i]==0:
nums[i],nums[left]=nums[left],nums[i]
left+=1
l = left
for i inrange(l,right+1):if nums[i]==1:
nums[i],nums[left]=nums[left],nums[i]
left+=1# 反思1:
思路二:一次遍历通过!!!yes!这55min值了…555
classSolution:defsortColors(self, nums: List[int])->None:"""
Do not return anything, modify nums in-place instead.
"""# 思路:提示了只使用常数空间一次扫描,明显是多指针法三指针,左指针用来存放0,右指针用来存放2,中指针用来找0和2# 本题还可以使用哈希表存储三个元素出现的次数,然后再输出数组,哈希表可以用数组或者字典模拟# 或者多趟扫描:第一趟扫描0,用一个指针储存并且记录第二趟的起点,第二趟扫描1
left ,mid =0,0
right =len(nums)-1while left<=mid<=right:#注意此处的边界问题,必须加=,最好在边界问题多做几个假设。while left<=mid<=right and(nums[mid]==0or nums[mid]==2):if nums[mid]==0:
nums[left],nums[mid]=nums[mid],nums[left]
left+=1elif nums[mid]==2:
nums[right],nums[mid]=nums[mid],nums[right]
right-=1
mid+=1#bug过程:1.mid<right 导致示例2没有通过;2.改为mid<=right,提交,过了40个,一半,[1,2,0]不过#3.考虑mid换后为0或者2的情况,使用while,只过了一个示例!#4.观察错误时的特点,发现mid和left会陷入互换死循环,偶然想到加上左边的小于等于,恰好可以终止死循环,ac!