数组中两个数的乘积

时间:2010-12-08 05:30:57

标签: algorithm

给定一个n个不同整数的数组。找到数组中的所有x,y对,使得z(给定)= x * y ...在没有排序的情况下以最有效的方式进行...

[edit]整数在int范围内,即0-65536,如果有帮助,则数字为非负数。 不想排序因为它需要花费很多时间。存储空间不是问题。

3 个答案:

答案 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并继续......