问题描述
我是在 leetcode 上做这个问题的:
给定一个数组 nums,其中有 n 个颜色为红色、白色或蓝色的对象,排序 它们就地,以便相同颜色的对象相邻,并且 颜色按红色、白色和蓝色的顺序排列。
这里,我们将使用整数 0、1 和 2 来表示红色, 分别为白色和蓝色。
虽然有一个相当令人满意的解决方案,即单次将 0 向左推,将 2 向右推,但我很难理解为什么计数排序也不能算作就地排序解决这个问题。
毕竟,你只需要常数空间来进行计算。
您可能会争辩说“当然,但如果我说有 N 种颜色,它就不再是恒定空间”,但这只是一个不同的问题,并且预期的解决方案不适用于 N 种颜色。
那么是什么让计数排序不是这个问题的一个很好的、有效的答案?
解决方法
当然,您可能有三个整数变量来计算每种颜色的出现次数,然后以正确的顺序用每种颜色的正确数量填充初始数组。这有一个恒定的空间成本(除了输入数组),并且是对这个问题的一个完全有效的答案。
当然,如果颜色的数量不再是恒定的,那么这个方法不成立,但是你不能进行就地计数排序;您将不得不求助于另一种算法进行就地排序,代价是时间复杂度更高。