“确定列表是否包含两个总和为0的整数”的替代解决方案

时间:2013-03-13 14:41:55

标签: algorithm sorting

假设您有一个任意的整数列表,如果列表中存在一对总和为0的对,则返回True

我能够生成n * log(n)复杂度的解决方案。这是一个简短的草图(虽然有一种更简单的方法,见下文):

  1. 对数组进行排序。设置指向第一个元素的指针。
  2. 调查指针的元素(首先调用它)和数组相反的元素(最后调用它)。如果第一个元素的大小大于最后一个元素的大小,则删除第一个元素并将指针移动到最后一个元素。否则开始向后遍历数组,寻找(可能的)总和。
  3. 如果没有找到总和,则将指针移动到下一个元素并重复2。
  4. 上述解释并不重要。 显然还有另一个使用词典的解决方案。有人可以启发我吗?

3 个答案:

答案 0 :(得分:3)

如果元素是-x和x,则可以得到0的和。遍历所有元素并将值存储在字典中。如果你有一个x检查是否设置了-x。

顺便说一下,你的解决方案是n * log(n)+ n而不是n * log(n)</nitpick>:)

答案 1 :(得分:1)

您将key=nvalue=0-n添加到字典中。如果字典已包含0-n作为键 - &gt;找到了这对。

答案 2 :(得分:1)

通过使用散列图数据结构,您可以轻松实现O(n)时间/空间复杂度。

  1. 遍历所有元素并将它们放到你的hashmap中(时间复杂度为O(n),考虑到,hashmap操作的分摊时间复杂度为insert,find和delete为O(1))
  2. 遍历所有元素,并且对于每一个元素检查,如果hashmap包含逆值(即,对于每个值V check,如果hashmap包含-V值)。时间复杂度也是O(n)。
  3. O(n)+ O(n)= O(n)