我们给出了一个形式的字符串:RBBR,其中R - 红色和B - 蓝色。
我们需要找到所需的最小交换次数,以便将颜色组合在一起。在上述情况下,答案为1
以获得RRBB或BBRR。
我觉得对一个部分排序的数组进行排序的算法在这里很有用,因为简单的排序会给我们交换次数,但我们需要minimum
个交换次数。
有什么想法吗?
根据this,据称这是一个微软采访问题。
答案 0 :(得分:16)
对字符串进行一次传递并计算红色数量(#R)和蓝色数量(#B)。然后再计算第一个#R球(#r)中的红色数和第一个#B球(#b)中的蓝色球数。 (#R - #r)和(#B - #b)中的较小者将是所需的最小交换次数。
答案 1 :(得分:3)
我们给出了我们必须转换为最终字符串F = R ^ a B ^ b或B ^ b R ^ a的字符串S. S和F之间的差异数量应该是均匀的,因为每个错位的R都会有一个互补的错位B.所以为什么不找到S和两个可能的F之间的最小差异数并将其除以2?
例如,您将获得应转换为的S = RBRRBRBR
RRRRRBBB
要么
BBBRRRRR
比较每种可能性的每个字符的S和F之间的差异,每个可能的最终字符串有4个差异,因此无论最小值是2个交换。
答案 2 :(得分:0)
让我们来看看你的例子。您知道最终状态将是RRBB或BBRR。换句话说,结束状态总是nRmB或mBnR,其中n是R的数量,m是字符串中的数字o B. 既然定义了最终状态,那么某种路径寻找算法对此可能是一个很好的方法吗?如何将每个交换视为状态变化并考虑启发式函数来使所需的剩余交换数量近似。 我只是在空中投掷一个想法,但我希望这会有所帮助。
答案 3 :(得分:0)
从字符串的右端和左端同时开始两个索引。推进左侧索引,直到找到R
。向后推进正确的索引,直到找到B
。交换它们。重复,直到左索引符合正确的索引,并计算交换。然后,执行相同操作,但在左侧查找B
,在右侧查找R
。最小值是两个交换计数中的较低者。
答案 4 :(得分:0)
我认为交换的数量可以从对向量进行排序所需的反转次数中得出。 This是使用置换向量进行相同操作的示例。
答案 5 :(得分:0)
这不是技术上的答案,但我更直观地看了一下。
RRBBBBR可以简化为RBR,因为一组R可以作为单个块移动。这意味着该数组实际上只是N组RB。
唯一重要的是N组RB块的数量(包括最后一块的不完整块)。
因此,为了概括这一点,需要的交换次数= N组RB块(包括不完整的块)并减去1。