我们有一个形如:RBBR 的字符串,其中 R 代表红色,B 代表蓝色。
我们需要找到将颜色归类在一起所需的最小交换次数。对于上述情况,答案是 1
,可得到 RRBB 或 BBRR。
我觉得在这里使用算法来排序部分排序的数组会很有用,因为简单的排序可以给我们交换的次数,但我们想要的是 最小
交换次数。
有什么想法吗?
据说这是微软的面试题,参见 这里。
我们有一个形如:RBBR 的字符串,其中 R 代表红色,B 代表蓝色。
我们需要找到将颜色归类在一起所需的最小交换次数。对于上述情况,答案是 1
,可得到 RRBB 或 BBRR。
我觉得在这里使用算法来排序部分排序的数组会很有用,因为简单的排序可以给我们交换的次数,但我们想要的是 最小
交换次数。
有什么想法吗?
据说这是微软的面试题,参见 这里。
对字符串进行一次遍历,计算红色(#R)和蓝色(#B)的数量。然后进行第二次遍历,计算前 #R 个球中红色球的数量(#r)以及前 #B 个球中蓝色球的数量(#b)。(#R-#r) 和 (#B-#b) 中较小的值将是所需交换的最小次数。
RR...RBB...B
或BB...BRR...R
。上面的代码只是计算通过交换哪一个更便宜实现这两个中的一个。 - Rafał Dowgird#R - #r
是指#R
个球中"空位"的数量。一旦理解了这点,剩下的就很简单了。非常好的解决方案。 - Matthieu M.这不是一个技术性的答案,但我更多地凭直觉看待了这个问题。
RRBBBBR 可以被缩减为 RBR,因为一组 R 可以作为一个单元块移动。这意味着数组实际上只是 N 个 RB 集合。
唯一重要的是 N 个 RB 块集的数量(包括最后一个不完整的块)。
因此,概括来说,所需的交换次数 = N 个 RB 块集(包括不完整的块),并减去 1。
R
。将右索引向后移动,直到找到一个 B
。交换它们。重复此过程,直到左索引遇到右索引,并计算交换次数。然后,进行相同的操作,但在左侧查找 B
并在右侧查找 R
。最小值是两个交换计数的较小值。