给定一个包含红色、白色和蓝色,且含有 n 个元素的数组,对它们进行排序,使得相同颜色的元素相邻,颜色顺序为红色、白色、蓝色。
此题中,我们使用整数 0, 1 和 2 分别表示红色,白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
进阶:
一个相当直观的解决方案是使用计数排序的 two-pass 算法。
首先,迭代计算出0,1 和 2 元素的个数,然后重写当前数组。
你能想出一个仅使用恒定空间的 one-pass 算法吗?
解题思路:
统计0,1,2的个数,然后给数组赋值,注意:每赋值一个数,其他的要相应往后面移动一位。
解题代码: 注意每个if中那个几个执行语句的顺序!!!
x=y=z=-1
for i in range(len(nums)):
if nums[i]==0:
x+=1
y+=1
z+=1
if z!=-1:
nums[z]=2
if y!=-1:
nums[y]=1
nums[x]=0
elif nums[i]==1:
y+=1
z+=1
if z!=-1:
nums[z]=2
if x!=-1:
nums[x]=0
if y!=-1:
nums[y]=1
elif nums[i]==2:
z+=1
if y!=-1:
nums[y]=1
if x!=-1:
nums[x]=0
nums[z]=2