XiiXXii

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目描述:给定一个包含红色、白色和蓝色,一共 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

 

posted on 2020-10-10 17:14  XiiXXii  阅读(112)  评论(0)    收藏  举报