嗨我正在寻找一种算法,给定一个数组作为输入将重新洗牌,以便可能存在最小数量的相等相邻值。
我会试着解释一下:
in:[4,4,4,4,5,5,5,5] -> out: [4,5,4,5,4,5,4,5] or [5,4,5,4,5,4,5,4]
in:[1,2,3,4,5,6,7,8] -> out:
任何订单都会执行,因为所有值都不同
in:[1,1,2,2,3,3,1,1] -> out: [1,2,1,3,1,2,3,1]
或任何其他没有相邻值的组合
谢谢!
答案 0 :(得分:1)
假设max_cnt
是所有元素中出现的最大次数,n
是数组的大小。
如果没有元素出现超过ceil(n / 2)
次,则可以使所有相邻元素不同,因为可以以这样的方式排列它们:具有相同值的元素之间的距离至少为2例如:
a = [1,1,1,1,2,2,3]。我们可以重新排列它:[1,2,1,2,1,3,1]。
重新排列的算法很简单:在位置i, i + 2, i + 4, ...
上放置相等的元素,依此类推。
如果max_cnt > ceil(n / 2)
位置,那么您可以使用上述算法构造最长可能的前缀,没有相等的相邻元素,然后用剩余值填充后缀。例:
a = [1,1,1,1,2,3]。前缀是[1,2,1,3,1]。剩下的就是其余的:[1,2,1,3,1,1,1]。相等的相邻元素的数量是2 * max_cnt - n - 1
。