分类颜色

给定一个包含红色、白色和蓝色,一共 n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

进阶:

  1. 一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
  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)

你可能感兴趣的:(分类颜色)