[英]Find all pairs (x, y) in an unsorted array so that x + y = z
我有n个数字和z个数字。 我想创建一个算法(伪代码)来查找在O(nlogn)中是否存在x + y = z的对(x,y)。
我以为我可以运行quicksort算法。 然后,我将有2个数组:array1(元素<枢轴)和array2(元素>枢轴)。 如果数组中的第一个元素<z,那么我可以检查array1中的所有其他元素以找到x + y = z的对。 否则,如果array1中的第一个元素> z,则我转到array2并执行相同的过程。 我的建议是真的吗?
首先,对数组进行排序。
然后将一个指针/索引设置到排序数组的每一端。
如果它们的总和为z
,则保留它并将两个指针移到中间。
如果总和小于z
,则将小端上的指针移到中间。
如果总和大于z
,则将大端的指针移到中间。
当指针相遇/通过时,您就完成了。
具有枢轴的想法行不通,因为没有合适的枢轴候选者,并且因为检查总排序复杂度,检查未排序的半范围仍将是O(n)任务,需要完成n / 2次的O(n 2 )。
通过将所有元素添加到哈希表中,然后检查每个元素x
是否还存在zx
元素,可以在O(n)中进行排序而不进行排序。 x=z/2
的情况是一种特殊情况,因为您需要验证输入数组中是否存在两个z/2
值。
您无需对已经排序的序列进行排序,只需对其进行搜索即可。
伪代码:
sort(sequence) // O(NlogN) sorts are well known
for element in sequence: // O(N) loop
target = z - element // constant (assuming fixed size arithmetic)
if target > min_element and target < max_element: // constant
found = binary_search(target, sequence) // O(LogN) search
复杂度:根据需要O(NlogN(排序)+(N(循环)* LogN(搜索)))= O(NlogN)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.