# 给定一个包含红色、白色和蓝色，一共 n 个元素的数组，原地对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。
#
# 此题中，我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
#
# 注意:
# 不能使用代码库中的排序函数来解决这道题。
#
# 示例:
#
# 输入: [2,0,2,1,1,0]
# 输出: [0,0,1,1,2,2]
# 进阶：
#
# 一个直观的解决方案是使用计数排序的两趟扫描算法。
# 首先，迭代计算出0、1 和 2 元素的个数，然后按照0、1、2的排序，重写当前数组。
# 你能想出一个仅使用常数空间的一趟扫描算法吗？
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 荷兰三色问题求解
        # 利用三指针，初始化p0，curr，p2
        p0, curr = 0, 0
        p2 = len(nums) - 1
        while curr <= p2:
            if nums[curr] == 2:
                nums[curr], nums[p2] = nums[p2], nums[curr]
                p2 -= 1
            elif nums[curr] == 1:
                curr += 1
            else:
                nums[p0], nums[curr] = nums[curr], nums[p0]
                p0 += 1
                curr += 1
        return nums
# 时间复杂度：由于对长度为N的数组进行了一次遍历，时间复杂度为O(N)。
# 空间复杂度：由于只使用了常数空间，空间复杂度为O(1)。