不使用集合删除带有O(N)的重复数组元素?

时间:2013-11-04 06:38:28

标签: arrays algorithm duplicate-removal

假设我有一个整数元素数组,这里我想删除所有重复的元素,并使用任何Java.util类打印剩余的元素。我使用2个指针扫描并删除所有重复但是需要O(N ^ 2)来解决它。我只想知道是否有任何算法可以在O(N)中完成这项任务?

示例:

Input Array:    [1, 2, 3, 4, 5, 4, 3, 4, 6]
Expected Array: [1, 2, 5, 6]

3 个答案:

答案 0 :(得分:3)

您可以使用存储桶来实现O(N)+ C(使用巨大的C)但是以存储为代价

  1. 创建一个名为bucket [MAX_INT]
  2. 的MAX_INT大小的整数数组
  3. 循环输入数组。如果value是x,则增加bucket [x] ++;
  4. 再次循环输入数组。对于每个x if bucket [x] == 1,添加到预期的数组中。
  5. bucket []数组可以用更好的数据结构替换。但它仍然达到了O(N)

答案 1 :(得分:1)

我会使用Set。

for each item:
  if item is in the Set
    ignore it
  else
    copy it somewhere or output it or whatever
    add it to the Set

那应该适合你。

使用HashSet似乎对addcontainsTime complexity of set in Java)具有O(1)复杂度

答案 2 :(得分:0)

您可以使用任何算法对所有元素进行排序,例如合并排序,快速排序,复杂度为n lg n。 然后使用堆栈向其中添加元素。继续将元素推送到堆栈,直到找到重复。如果从stack.it弹出重复元素将删除重复元素。 总复杂度为O(n lg n)。这可能是解决问题的有效方法。