奇怪的一个算法

时间:2015-02-15 12:45:41

标签: algorithm

给定一组N个数字,我应该找到奇数的数字。现在N是一个奇数,确定'奇数一个'的方法是将给定的数字组合在一起,最后你将留下一个数字,即'奇数一个'。

数字根据它们之间的距离进行配对。首先,从给定的一组数字中挑选两个距离最小的数字并将它们配对在一起。这使我们在集合中留下了N-2个数字。重复该过程,直到只剩下1个数字。

示例:{1,4,3}

1到3之间的距离是2,3到4之间的距离只有1.所以3和4是配对的,这使我们失去了1个,使它成为奇怪的人。

到目前为止,我所能想到的是对给定列表进行排序,找出每个数字之间的差异并消除对,从它们之间距离最小的对开始。这最终会让我感到“奇怪的一个”,但问题必须通过复杂度小于O(N ^ 2)的算法来解决。一些正确方向的帮助将不胜感激。谢谢

又一个例子:{1,3,4,6,10}

对差异最小3,4对消除对 - > {} 1,6,10 具有最小差异的对6,10消除对 - > {1}是奇怪的

另一个例子{2,4,1,10,8,9,6}

与最小差异(1,2)(8,9)和(9,10)配对。消除(1,2)和(8,9)或(10,9)无关紧要(类似的距离结果可以是任何一种方式;不可预测的)让pick(8,9) - > {4,10,6}

接下来消除(4,6) - > {10}是奇怪的 注意:本来可以选择(9,10)而不是(8,9)。

我希望这可以解决问题

1 个答案:

答案 0 :(得分:2)

一种可能的O(nlogn)解决方案如下:

  1. 对数组进行排序(在O(nlogn)时间内)。
  2. 计算排序数组中相邻元素之间的差异。
  3. 将差值(以及各对)存储在最小堆中。
  4. 从最小堆中弹出顶对。对于每个弹出的对,您将不得不向堆添加另一对。这将对应于弹出对中的相邻元素。例如,如果数组是{....,3,5,6,9,....}并且弹出的对是{5,6},那么在堆{3,9}中添加另一对差值为6.
  5. 此外,跟踪已经弹出的元素(可能在哈希表中)并简单地拒绝已弹出任何元素的任何弹出对。
  6. 一旦堆为空,未包含在任何有效弹出对中的元素应为奇数。