题目描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。你能想出一个仅使用常数空间的一趟扫描算法吗?
解题思路1:
- 利用 numpy中的 unique进行列表去重
- 去重之后的元素进行排序
- 判断去重后每个元素的数量
- 根据元素数量的不同依次写入
代码1:
import numpy as np
class Solution(object):
def sortColors(self, nums):
Lis = []
number = np.unique(nums) # 去重
for i in range(len(number)-1): # 去重后的排序
if number[i] > number[i+1]:
temp = number[i]
number[i] = number[i+1]
number[i+1] = temp
for i in range(len(number)): # 判断去重后每个元素的数量
counti = 0
for j in range(len(nums)):
if number[i] == nums[j]:
counti += 1
for k in range(counti): # 根据元素的数量依次写入即可
Lis.append(number[i])
return Lis
s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))
解题思路2:
核心思想是对列表元素进行排序,依次进行比较即可
代码2:
class Solution(object):
def sortColors(self, nums):
size = len(nums)
for i in range(size-1):
for j in range(i, size):
if nums[i] > nums[j]:
nums[i], nums[j] = nums[j], nums[i]
return nums
s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))
解题思路3:
思路与上述解题思路相同,只是代码写法处稍有不同,来源于:leetcode–75–颜色分类
代码3:
class Solution(object):
def sortColors(self, nums):
size = len(nums)
for i in range(size-1):
for j in range(size-1-i):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))