一、题设
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1] 输出:[0,1,2]
提示:
n == nums.length
1 <= n <= 300
nums[i]
为0
、1
或2
二、基本思路
法一:统计0、1、2个数重新赋值。
法二:定义前后指针,用i遍历数组,当遍历到0时与前指针交换,当遍历到2时与后指针交换。注意在遍历到2交换数值后i处的值还需要再比较。
三、代码实现
法一:
class Solution(object):
def sortColors(self, nums):
n0,n1,n2 = 0,0,0
for item in nums:
if item == 0:
n0 += 1
elif item == 1:
n1 += 1
else:
n2 += 1
nums[0:n0] = [0] * n0
nums[n0:n0 + n1] =[1] * n1
nums[n0 + n1:n0 + n1 + n2] = [2] * n2
法二:
class Solution(object):
def sortColors(self, nums):
left , right = 0 ,len(nums)-1
i = 0
while i <= right:
if nums[i] == 2:
nums[right],nums[i] = nums[i],nums[right]
right -= 1
i -= 1
elif nums[i] == 0:
nums[left],nums[i] = nums[i],nums[left]
left += 1
i += 1
四、效率总结
法一:
法二: