【问题标题】:Find Duplicates in integer array and print them in actual order in C++ [closed]在整数数组中查找重复项并在 C++ 中按实际顺序打印它们 [关闭]
【发布时间】:2015-10-24 16:08:26
【问题描述】:

我无法通过互联网找到我的问题的解决方案。

我有一个包含正数和负数的整数数组。如下所示

int arr[] = {56, 1, -1, 89, 89, 7 ,0, 5, 5, 56, 0,9 22, 33,67, 7, -1}

我需要找到数组中的所有重复项。 需要显示的输出(请注意保持顺序)如下:

 56 -1 89 7 0 5 

我知道可以在 O(n) 时间内使用哈希找到重复项。但是我在维持秩序方面遇到了问题。 另外我不太了解 C++ 标准哈希。

任何人都可以建议我,如何在 C++ 中做到这一点。允许使用 STL。

【问题讨论】:

  • 我投票结束这个问题,因为 Stack Overflow 不是代码编写服务。
  • 我会否决它,但我的票已经用完了:(
  • 除了@πάνταῥεῖ的反对,你的问题也不清楚。有几种替代解决方案是可能的,但取决于额外的约束,例如:输入数组可以修改吗?如果没有,我们可以使用多少额外的空间?时间复杂度要求是什么:微不足道的 O(n^2) 可以接受吗?等等。
  • 不应修改初始数组。输出应放置在另一个数组中。时间复杂度小于 O(n^2)。寻找空间复杂度最小的最优解。
  • @MartinJames:OP 改变了问题,不再仅仅要求代码。现在它只是要求一种算法按照首次出现的顺序生成重复列表,而不是按照重复检测的顺序。

标签: c++ arrays algorithm duplicates hashtable


【解决方案1】:

以相反的顺序扫描输入数组中的重复项,跟踪最后一次出现的重复项。然后反转该列表,您将在输入数组中按第一次出现的顺序获得重复项列表。

例如

  • 从输入数组的末尾循环到开头

  • 将每个值添加到无序集合中

  • 如果该值已经存在,则它是重复的。将其添加到重复列表中
    value->position 的地图),替换之前的任何值。

扫描输入数组完成后,按位置对重复列表进行排序,并将这些值放入列表中。

与具有位置和重复计数的每个条目(甚至非重复)相比,使用无序集和具有位置的单独重复列表可减少存储开销。如果只有几个重复项,它还可以减少花费的时间。 (因为您不必遍历所有值的整个集合,只查找重复计数 > 1 的值。)

【讨论】:

  • 非常感谢彼得。这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2016-01-10
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多