1、题目描述
https://leetcode-cn.com/problems/sort-colors/
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
2、代码详解
https://leetcode.com/problems/sort-colors/
只使用恒定空间的一次通过算法(双指针,白色指针是循环变量i)
这是一个荷兰国旗问题。我们将数组分为四组:红色,白色,非分类和蓝色。最初,我们将所有元素分组为非分类。只要白色指针小于蓝色指针,我们就从头开始迭代。
如果白色指针为红色(nums [white] == 0),我们用红色指针交换并向前移动白色和红色指针。如果指针是白色的(nums [white] == 1),则元素已经在正确的位置,因此我们不必交换,只需向前移动白色指针。如果白色指针为蓝色,我们将交换最新的未分类元素。
class Solution(object):
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
n = len(nums)
if n < 2:
return
# all in [0, p0) == 0
# all in [p0, i) == 1
# all in (p2, len-1] == 2
red = 0 # p0 = red
white = 0 # i = white 循环变量
blue = len(nums) - 1 # p2 = blue
while white <= blue:
if nums[white] == 0:
nums[red], nums[white] = nums[white], nums[red]
white += 1
red += 1
elif nums[white] == 1:
white += 1
else: # nums[white] == 2
nums[white], nums[blue] = nums[blue], nums[white]
blue -= 1
视频解析:https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/