Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 给定一串红色和蓝色的球,找到最小交换数,将颜色组合在一起_Arrays_Algorithm_Sorting - Fatal编程技术网

Arrays 给定一串红色和蓝色的球,找到最小交换数,将颜色组合在一起

Arrays 给定一串红色和蓝色的球,找到最小交换数,将颜色组合在一起,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我们得到了一个字符串形式:RBBR,其中R-红色和B-蓝色 我们需要找到所需的最小交换数量,以便将颜色组合在一起。在上述情况下,答案将是1,以获得RRBB或BBRR 我觉得对部分排序的数组进行排序的算法在这里很有用,因为简单的排序会给出交换的数量,但我们需要交换的最小值 有什么想法吗 据称,这是一个微软的采访问题 让我们看看你的例子。您知道最终状态将是RRBB或BBRR。换句话说,结束状态总是nRmB或mBnR,其中n是字符串中R的数量,m是ob的数量。 既然定义了终端状态,也许某种路径查找算法

我们得到了一个字符串形式:RBBR,其中R-红色和B-蓝色

我们需要找到所需的最小交换数量,以便将颜色组合在一起。在上述情况下,答案将是
1
,以获得RRBB或BBRR

我觉得对部分排序的数组进行排序的算法在这里很有用,因为简单的排序会给出交换的数量,但我们需要交换的
最小值

有什么想法吗


据称,这是一个微软的采访问题

让我们看看你的例子。您知道最终状态将是RRBB或BBRR。换句话说,结束状态总是nRmB或mBnR,其中n是字符串中R的数量,m是ob的数量。 既然定义了终端状态,也许某种路径查找算法是一种很好的方法?将每次交换视为一种状态变化,并考虑一个启发式函数来近似估计所需的剩余交换数量。
我只是想提出一个想法,但我希望这能有所帮助。

在琴弦上传球一次,数一数红色(#R)和蓝色(#B)的数量。然后进行第二次传球,计算第一个R球(#R)中的红色球数和第一个B球(#B)中的蓝色球数。(#R-#R)和(#B-#B)中的较小者将是所需的最小交换数。

我们得到了必须转换为最终字符串F=R^a B^B或B^B R^a的字符串S。S和F之间的差异数量应该是偶数,因为对于每个错位的R,都会有一个互补的错位的B。那么为什么不找出S和两个可能的F之间的最小差异数量,并将其除以2呢

例如,您得到的S=RBRRBRBR应该转换为 RRR BBB
或 BBBRRRRR


比较每种可能性的每个字符的S和F之间的差异,每个可能的最终字符串有4个差异,因此不管最小值是2次交换

从字符串的右端和左端同时开始两个索引。前进左索引,直到找到
R
。向后推进右索引,直到找到a
B
。交换它们。重复此操作,直到左索引与右索引匹配,然后计算掉期。然后,执行相同的操作,但在左侧和右侧分别查找
B
。最小值是两个交换计数中的较低值。

我认为交换的数量可以从向量排序所需的反转数中推导出来。这不是一个技术上的答案,但我看得更直观一些

由于一组R可以作为单个块移动,因此RRBBR is可以减少为RBR。这意味着数组实际上只是N组RB

唯一重要的是N组RB块的数量(包括最后一组的不完整块)

  • RBR->1交换以到达RRB(2套RB块、RB和R)
  • RBRB->1次交换以到达RRBB(2整套RB块)
  • RBRB->2次交换以到达RRRBBB(3套完整的RB区块)
  • RBRB->4套RB=3套掉期

因此,为了推广这一点,所需交换的数量=N组RB块(包括不完整块)并减去1。

闻起来像动态规划和*-风格的寻路在这里很有用。我感兴趣的是对多种颜色的球进行排序所需的最小交换数量这一更一般的问题。我在回答中给出的算法在球的数量上是线性的,但在颜色的数量上是阶乘的(因为可能的目标字符串的数量是所涉及的颜色的排列)。有更好的方法吗?@Null Set:@bronzerbeard引用了一个关于排序3色字符串的答案。也许这可以作为一个起点。恐怕我在这方面做得太深了。我只是说不出你是写了还是错了,你能解释一下你是如何得到这些公式的吗?@Matthieu M:据我所知,目标配置必须是以下两种之一:
RR…RBB…B
BB…BRR…R
。上面只计算了通过互换实现这两个字符串中的哪一个更便宜。@Matthieu一旦你知道有多少个红色和蓝色,你就可以确切地知道两个可能的结束字符串是什么样子,要么所有的红色都在右边,要么所有的蓝色都在右边。您只需找出这两个字符串中哪一个与起始字符串“更接近”。y@Matthieu:一旦你知道了红色和蓝色的数量,你就可以确切地知道两个可能的结束字符串是什么样子的,要么是右边的所有红色,要么是右边的所有蓝色。您只需计算这两个字符串中哪一个与起始字符串“更接近”。你可以通过计算空间中充满红色或蓝色的“洞”的数量来做到这一点。当前未被目标颜色占据的每个点都需要与字符串另一侧的球交换。然后您只需选择需要较少交换的配置。谢谢,我不知道
#R-#R
#R
第一个球中的“孔”数。事实上,一旦你得到了它,剩下的就显得微不足道了。很好的解决方案。