【问题标题】:Given a string of red and blue balls, find min number of swaps to club the colors together给定一串红色和蓝色的球,找到最小交换次数以将颜色组合在一起
【发布时间】:2011-06-06 22:52:57
【问题描述】:

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

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

我觉得在这里对部分排序的数组进行排序的算法会很有用,因为简单的排序会给我们交换次数,但我们想要minimum 交换次数。

有什么想法吗?

据称这是this 的微软面试问题。

【问题讨论】:

  • 闻起来像动态编程和 A* 风格的寻路在这里会很有用。
  • 我对分类多种颜色的球所需的最少交换次数这一更普遍的问题感兴趣。我在回答中给出的算法对球的数量是线性的,但对颜色的数量是阶乘的(因为可能的目标字符串的数量是所涉及颜色的排列)。有没有更好的办法?
  • @Null Set:@bronzerbeard 写了一个引用 en.wikipedia.org/wiki/Dutch_national_flag_problem 的答案,这是关于对 3 色字符串进行排序的。也许这可能是一个起点。

标签: arrays algorithm sorting


【解决方案1】:

这不是一个技术性的答案,但我更直观地看了一下。

RRBBBBR 可以简化为 RBR,因为一组 R 可以作为单个块移动。这意味着该数组实际上只是一个 N 组 RB。

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

  • RBR -> 1 次交换以到达 RRB(2 组 RB 块,RB 和 R)
  • RBRB-> 1 次交换以获得 RRBB(2 组完整的 RB 块)
  • RBRBRB-> 2 次交换以获得 RRRBBB(3 组完整的 RB 块)
  • RBRBRBRB -> 4 组 RB = 3 次交换

所以概括一下,需要的交换次数 = N 组 RB 块(包括不完整块)并减去 1。

【讨论】:

    【解决方案2】:

    我认为交换次数可以从对向量进行排序所需的反转次数得出。 This 是对置换向量进行相同处理的示例。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        例如,给定 S = RBRRBRBR 应该转换为 RRRRRBBB
        要么 BBBRRRRR

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

        【讨论】:

          【解决方案5】:

          对字符串进行一次遍历并计算红色的数量 (#R) 和蓝色的数量 (#B)。然后再计算第一个#R 球(#r) 中的红色球数和第一个#B 球(#b) 中的蓝色球数。 (#R - #r) 和 (#B - #b) 中的较小者将是所需的最小交换次数。

          【讨论】:

          • 恐怕我在这里超出了我的深度。我只是不能说你是写错还是写错了,你愿意解释一下你是如何得到这些公式的吗?
          • @Matthieu M.:据我了解,目标配置必须是以下两个之一:RR...RBB...BBB...BRR...R。以上只是计算通过交换实现两者中的哪一个更便宜。
          • @Matthieu 一旦你知道有多少红色和蓝色,你就知道两个可能的结尾字符串是什么样子的,右边是所有的红色或右边的所有蓝色。您只需要弄清楚这两个字符串中的哪个字符串“更接近”起始字符串。是的
          • @Matthieu:一旦你知道了红色和蓝色的数量,你就知道两个可能的结尾字符串是什么样子了,要么是右边的所有红色,要么是右边的所有蓝色.您只需要计算这两个字符串中的哪一个“更接近”起始字符串。您可以通过计算您知道将充满红色或充满蓝色的空间中的“洞”数量来做到这一点。当前未被目标颜色占据的每个点都需要与字符串另一侧的球交换。然后,您只需选择需要较少交换的配置。
          • 谢谢,我不明白#R - #r#R 第一个球中的“洞”数。实际上,一旦你得到它,其余的似乎都很微不足道。很好的解决方案。
          【解决方案6】:

          让我们看看你的例子。您知道最终状态将是 RRBB 或 BBRR。换句话说,结束状态始终是 nRmB 或 mBnR,其中 n 是 R 的数量,m 是字符串中 o B 的数量。 由于定义了最终状态,也许某种寻路算法会是一个很好的方法?如何将每个交换视为状态变化并考虑启发式函数来近似所需的剩余交换数量。 我只是在空中提出一个想法,但我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2012-08-03
            • 1970-01-01
            • 1970-01-01
            • 2015-09-29
            • 2011-10-31
            • 2013-02-05
            • 2022-12-19
            • 1970-01-01
            • 2020-05-08
            相关资源
            最近更新 更多