【问题标题】:how to remove duplicate numbers from unsorted array如何从未排序的数组中删除重复的数字
【发布时间】:2015-10-31 05:24:24
【问题描述】:

我在一次技术面试中被问到以下问题:

如何从未排序的数组中删除重复项?

我正在考虑的一个选项:

  1. 使用数组中每个数字的频率创建一个哈希映射
  2. 遍历数组并在哈希映射中进行 O(1) 查找。如果频率 > 0,则从数组中删除数字。

有没有更有效的方法?

另一种选择

  1. 使用快速排序或归并排序对数组 O(nlog n) 进行排序
  2. 然后遍历数组并删除重复项

为什么选项 1 比选项 2 更好?

我不能使用任何已经完成工作的函数,比如 array_unique。

【问题讨论】:

  • “我不能使用任何已经完成工作的函数,比如 array_unique”——为什么?
  • 这是他们给我的技术面试问题
  • 如果你不能使用现有的功能,那么所有的语言标签都是错误的。

标签: arrays algorithm hashmap big-o


【解决方案1】:

如果哈希映射表明存在重复,则不要从数组中删除对象,为什么不为哈希映射中的每个项目构建一个新数组,并且仅在不存在时才将其添加到数组中重复?这个想法是为了节省在开始时拥有 2 个具有相同开销的数组的额外步骤。 PHP 在垃圾回收方面很糟糕,所以如果你从一个庞大的数组开始,即使你取消了它的值,它可能仍然在内存中徘徊。

【讨论】:

  • 这也可能是对“为什么选项 1 比选项 2 更好?”问题的解释
【解决方案2】:

对于第一个选项,时间复杂度是O(n);因为创建为哈希映射 O(n) 并遍历数组 O(n),所以总共 O(n)。

对于第二个选项,时间复杂度是 O(log(n));因为排序 O(log(n)) 和迭代 O(n),所以总共 O(log(n))。

显然第一个选项更好。希望这会有所帮助:)

【讨论】:

  • 假设我们必须删除问题中提到的重复项,因此无法创建新数组。
  • 第二个选项使用空间。在确定算法是否最佳时,我们如何考虑空间?
  • 算法的有效性基于空间和时间。但是,决定使用哪种算法完全取决于您要使用该算法的情况。如果你负担不起额外的空间,你应该使用空间复杂度更高的算法。
【解决方案3】:

如果您对创建另一个数据结构来跟踪状态没有任何限制,但必须就地改变数组并且只删除重复项而不进行排序,那么您的第一个选项的变体可能是最好的。

我建议您在迭代数组时制作一个哈希图,将数组值用作键,并将任何垃圾(可能设置为 TRUE 的布尔值)用作值。当您遇到数组中的每个项目(即 O(n))时,请检查地图。如果存在,则从数组中删除该项目,如果不存在,则添加它们的键值对。无需跟踪计数,您只需跟踪遇到的情况。

许多语言都有内置的set 抽象数据类型,它基本上对构造或add all 操作执行此操作。如果您可以提供删除重复项的单独数据结构,只需创建一个包含数组项的新集合并让该数据结构删除重复项。

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 2013-11-05
    • 2022-01-03
    • 2021-10-01
    • 2016-10-01
    • 2022-01-10
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多