重新排列列表中的项目,使得两个相邻的项目不相同

时间:2017-04-11 17:10:39

标签: python arrays algorithm list

我们怎样才能最有效地做到这一点? 给定具有重复项目的列表,任务是重新排列列表中的项目,以使两个相邻项目不相同。

Input: [1,1,1,2,3] 
Output: [1,2,1,3,1] 

Input: [1,1,1,2,2]
Output: [1,2,1,2,1] 

Input: [1,1]
Output: Not Possible

Input: [1,1,1,1,2,3] 
Output: Not Possible

编辑:通用算法也很好!它不需要是Python。

2 个答案:

答案 0 :(得分:2)

我不擅长python,所以我在这里编写通用算法 -

  1. Build a max heapmaxHeap存储数字及其频率<array element, frequency>maxHeap将根据元素的频率进行排序。

  2. 创建一个临时密钥,用作上一个访问过的元素(结果数组中的前一个元素。将其初始化为<item = -inf , freq = -1>

  3. 虽然maxHeap不为空

    • 弹出元素并将其添加到结果中。
    • 将弹出元素的频率降低1
    • 如果频率&gt;将前一个元素推回到最大堆中。 0
    • 将当前元素作为下一次迭代的前一个元素。
  4. 如果生成的数组和原始数据的长度,则此数组没有解决方案。否则返回结果数组。

  5. 修改

    那些通过每次跳过一个位置将当前最频繁的元素放在偶数/奇数位置的贪婪解决方案的人不会工作,你可以尝试使用测试用例{{1 }}

答案 1 :(得分:0)

n为列表的大小。如果某个元素至少出现(n + 2) / 2(整数除法),那么显然没有解决方案(根据鸽子原理)。

否则,我们总能构建答案。我们可以这样做:让我们先记下所有偶数位置,然后记下所有奇数位置(我使用从0开始的指数)。之后,让我们按照频率(按递减顺序)对元素进行排序,并按上述顺序填充位置(注意:元素按对(频率,元素)排序,以便将相同的元素组合在一起。在答案构造的最开始只排序一次)。

如果我们使用哈希表计算元素并使用计数排序按频率对它们进行排序,则此算法可以在线性时间内运行。