【问题标题】:Best way to find in an array if there is X + Y = S如果存在 X + Y = S,则在数组中查找的最佳方法
【发布时间】:2020-01-22 20:40:41
【问题描述】:

如果在名为 A 的数组中有 2 个数字 X,Y,其中 X + Y = S,那么检查数组的最佳方法是什么? S可以是任意数(A中不一定存在)。

我说过,让我们排序最坏情况下花费 O(nlogn) 的数组然后让我们为第一个元素取 2 个指针,并为最后一个元素取另一个指针。

如果指针 1 + 指针 2,则开始 比较。如果结果大于指针 2,则 减少 1。如果结果小于指针,则 增加 指针 1 1. 直到我们移动 A 中的所有元素。

时间复杂度: nlogn + n(移入 2 个指针的最坏情况)= nlogn。

有没有更好的解决方案?

【问题讨论】:

  • HashMap (Dictionary) 的帮助下,您可以获得O(n) 的时间复杂度(以及O(n) HashMap 的空间使用情况)

标签: arrays algorithm time-complexity


【解决方案1】:

您可以创建一个基于散列的集合并将 A 中的所有元素添加到其中。然后您可以遍历 A 元素并检查该集合中是否存在 S - A_i 。假设在 O(1) 中包含和对基于哈希的集合进行操作,您将在 O(n) 中解决您的问题。

【讨论】:

  • 如果您的输入范围受到限制,您甚至不需要完整的散列集 - 只需一个带有位设置的大位掩码(如果它们在输入中)。如果输入中没有负数,则不会大于 S
  • @MarkRansom 位掩码可以改变时间复杂度吗?而且,我在这个答案中没有看到足够的证据支持 O(n)
  • @danh 没有位掩码不会改变复杂性,只会减少开销。例如,您不必计算哈希值。并且只要每个操作都是 O(1),如答案中所述,整体复杂度将是 O(n),因为每个元素只检查一次。
猜你喜欢
  • 2020-05-13
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
相关资源
最近更新 更多