有10,000个球,可能是500种不同颜色的球
示例:有:
4 - 红球
5900 - 蓝球
3700 - 绿球
396 - 薄荷球
或者可能有10,000个红球。
或者所有球都有相同的范围,即500红色,500蓝色等
我们不知道任何球的范围和颜色球的数量,但最小是1种颜色,最多是500种不同的颜色,我们有500的辅助阵列。如何将所有相同颜色的球一起排列在球的最小传球和最小交换?是不是可以在不到两次通过?
答案 0 :(得分:1)
您需要一次传递(使用OO语法的伪代码):
for (ball in balls) {
array[array.getIndexByName(ball.color)].add(ball);
}
其中getIndexByName返回分配给某种颜色的插槽。 如果没有为相关颜色分配插槽,则会分配一个新插槽。
假设getIndexByName的天真实现,复杂度为O(球数*颜色数)。
答案 1 :(得分:0)
首先,您可以查看所有球并计算每种颜色的出现次数,您可以使用您拥有的辅助阵列来完成此操作。
然后你知道每种颜色必须保留多少空间。因此,当你重新遍历所有球时,你有一个指针指向它们应该在输出数组中的位置,因为你知道你期望的每种颜色的球数。处理完球后,不要忘记更新颜色的计数器。
通过将球放在输入阵列中,将球放在它们应该到达的位置,可以获得O(n)
交换的算法。
一个例子:
第一部分很简单,比如你有10个球,3个red
,4个blue
,2个green
和1个yellow
球。
第二部分采用输入数组:red,blue,green,yellow
为简单起见,我们按顺序订购它们:
你从第一个球开始。如果它有颜色blue
,我们必须将它与数组中位置4
处的球交换(因为之前的所有球必须是red
。我们必须交换的新位置必须在辅助阵列中更新blue
球,现在应该是5
。如果我们交换的球是green
,我们将它与位置{{1}处的球交换现在如果在交换之后球是7
,我们可以继续下一个球。你当然可以跳过之前交换的球。重要的是要注意你最多交换一次球两次这种技术可以将它们交换到已知位置,因此您不需要额外的传递。
答案 2 :(得分:0)
你可以在不到两次通过中完成它,但它会更复杂。
这是我怎么做的 -
传递#1-确定每种颜色的球数和颜色数
每3种颜色传递#2-,(分别为示例1,4,5,球=在第10个点放置一个标记)并使用dutch color flag problem here