给定一个包含红色、白色和蓝色,一共 n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
解题思路:
第一种自然就是进阶中给出的一趟遍历计数后,再一趟重写数组
代码如下:
def sortColors(nums):
count = [0, 0, 0]
for i in nums:
count[i] += 1
nums.clear()
for i in range(3):
for j in range(count[i]):
nums.append(i)
还有第二种,只扫描一趟,可以使用一个新的数组,每次往新的数组里添加就行了,但要求了原地排序,那就只能在本数组内进行修改,我的想法是遇到0就在数组最前面加一个0,遇到2就在数组最后面加一个2,遇到1就在0后面加一个1,这需要两个变量记录0和2的个数,当然添加前还要删除本身。不过这种方法的速度算是很慢的了。排在了最后20%内,应该是数组的删除和添加耗费了时间
代码如下:
def sortColors(nums):
count_zero = 0
count_two = 0
for i in range(len(nums)):
if nums[i - count_two] == 0:
count_zero += 1
del nums[i - count_two]
nums.insert(0, 0)
elif nums[i - count_two] == 2:
del nums[i - count_two]
nums.append(2)
count_two += 1
else:
del nums[i - count_two]
nums.insert(count_zero, 1)
网友评论