题目描述:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
1.简单做法
统计数组中的每个颜色的个数,再遍历数组依次赋值;
class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ if not nums: return cnter=[0,0,0] for num in nums: cnter[num]+=1 i=0 for num,cnt in enumerate(cnter): for _ in range(cnt): nums[i]=num i+=1
2. 使用双指针实现一趟扫描
针对两种颜色定义两个指针,分别指向下一个插入位置,插入后指针要相应移动。题目要求结果按0 1 2排列并且是原地调整,根据指针指向颜色的不同,插入后所作的修改也有所不同。
2.1 指向0和1
遍历到等于0的 num时,将 num 和 p0 交换后,在 p1 != p0 的情况下,原本在 p0 位置的 1 被换走,并且再也遍历不到,因此需将 1 和 p0 做交换;
遍历到1时就不用管,一定符合要求

2.2 指向0和2
遍历到等于2的 num 时 ,将 num 和 p2 交换后,原 p2 位置如果是 0 或者 2,不处理要出问题,所以需要继续进行交换;
而遍历到0时,交换后就不用管了,一定满足要求。

def solveI(nums): p0,p1=0,0 for i,num in enumerate(nums): if num==1: nums[p1],nums[i]=nums[i],nums[p1] p1+=1 elif num==0: nums[p0],nums[i]=nums[i],nums[p0] if p1!=p0: nums[p1],nums[i]=nums[i],nums[p1] p0+=1 p1+=1 return nums
def solveII(nums): p0,p2=0,len(nums)-1 i=0 while i<len(nums): num=nums[i] if i>p2: break if num==0: nums[p0],nums[i]=nums[i],nums[p0] p0+=1 elif num==2: nums[p2],nums[i]=nums[i],nums[p2] p2-=1 if nums[i]==0 or nums[i]==2:continue i+=1 return nums
浙公网安备 33010602011771号