当问题限制输入值的数量时,是否可以考虑就地计数排序?

问题描述

我是在 leetcode 上做这个问题的:

给定一个数组 nums,其中有 n 个颜色为红色、白色或蓝色的对象,排序 它们就地,以便相同颜色的对象相邻,并且 颜色按红色、白色和蓝色的顺序排列。

这里,我们将使用整数 0、1 和 2 来表示红色, 分别为白色和蓝色。

虽然有一个相当令人满意的解决方案,即单次将 0 向左推,将 2 向右推,但我很难理解为什么计数排序也不能算作就地排序解决这个问题。

毕竟,你只需要常数空间来进行计算。

您可能会争辩说“当然,但如果我说有 N 种颜色,它就不再是恒定空间”,但这只是一个不同的问题,并且预期的解决方案不适用于 N 种颜色。

那么是什么让计数排序不是这个问题的一个很好的、有效的答案?

解决方法

当然,您可能有三个整数变量来计算每种颜色的出现次数,然后以正确的顺序用每种颜色的正确数量填充初始数组。这有一个恒定的空间成本(除了输入数组),并且是对这个问题的一个完全有效的答案。

当然,如果颜色的数量不再是恒定的,那么这个方法不成立,但是你不能进行就地计数排序;您将不得不求助于另一种算法进行就地排序,代价是时间复杂度更高。