给定一个n个不同整数的数组。找到数组中的所有x,y对,使得z(给定)= x * y ...在没有排序的情况下以最有效的方式进行...
[edit]整数在int范围内,即0-65536,如果有帮助,则数字为非负数。 不想排序因为它需要花费很多时间。存储空间不是问题。
答案 0 :(得分:1)
没有任何超级有效的方法可以做到这一点。我能想到的最好的是O(n ^ 2):
有一个辅助函数,它接受一个数字(a)和一个列表,并遍历每个元素(b)检查a * b = z并保存该对(如果是)。
遍历原始列表中的每个元素,如果特定元素(x)除以z(即z%x = 0),则将x和x之后的列表的其余部分发送到辅助函数。
更新:
我正在提供O(n ^ 2)解决方案,因为问题未指定唯一对。如果只需要唯一对,则应将其添加到问题中。此外,我的解决方案假设对的顺序无关紧要,这是另一个应该澄清的细节。
答案 1 :(得分:1)
这是基于线性时间哈希的解决方案:
Let hash be an array of size 65537 initilized to 0.
foreach element ele in Array
if ele != 0
hash[product/ele] = ele
end-if
if hash[ele] != 0 AND ele * hash[ele] == product
print ele, product/ele
end-if
end-foreach
答案 2 :(得分:0)
遍历数组...如果元素x
可以划分z
(即z % x == 0
),请检查HashTable中是否存在其他因素y=(z/x)
。 ..
如果是,那么你找到了一对......否则只需将它添加到hashTable并继续......