如果我们有一个整数数组,那么除了O(n ^ 2)之外是否有任何有效的方法可以找到一个给定值相差的整数对? 例如,对于阵列4,2,6,7,整数对的数量相差2是2 {(2,4),(4,6)}。 感谢。
答案 0 :(得分:5)
从列表中创建一个集合。创建另一个集合,其中所有元素都以增量递增。相交两组。这些是您的对的上限值。
在Python中:
>>> s = [4,2,6,7]
>>> d = 2
>>> s0 = set(s)
>>> sd = set(x+d for x in s0)
>>> set((x-d, x) for x in (s0 & sd))
set([(2, 4), (4, 6)])
创建集合是O(n)。相交集也是O(n),因此这是线性时间算法。
答案 1 :(得分:3)
将元素存储在多重集中,由哈希表实现。然后,对于每个元素n
,检查多重集中n-2
的出现次数并将它们相加。无需检查n+2
,因为这会导致您对每对进行两次计数。
时间效率在平均情况下为O(n),在最坏情况下为O(n * logn)或O(n ^ 2)(取决于散列表实现)。如果多重集由平衡树实现,则为O(n * logn)。
答案 2 :(得分:2)
对数组进行排序,然后用两个指针扫描。假设第一个指向a
,然后向前迈出第二个,直到找到a+2
为止存在的位置。增加总数,如果它在那里。然后递增第一个指针并重复。在每一步中,第二个指针从它在上一步结束的位置开始。
如果数组中允许重复,那么你需要记住第二个重复的重复次数,这样你就可以将这个数字加到总数中,如果递增第一个指针再次产生相同的整数。
这是O(n log n)
最坏的情况(对于排序),因为扫描是线性时间。
基于哈希表的固定宽度整数解决方案可以说它们预期是O(n)时间,这是O(n)
最坏的情况,因为排序固定宽度整数可以使用基数排序来完成在O(n)。实际上更快的是另一个问题 - 哈希表很快但可能涉及大量内存分配(用于节点)和/或严重本地化的内存访问,具体取决于实现。
答案 3 :(得分:1)
注意,如果所需的差值为0且阵列中的所有元素相同,则输出的大小为O(n²),因此任何算法的最坏情况都必须为O(n²)。 (另一方面,正如其他人所指出的那样,平均案例或预期案例行为可能会明显改善。)
答案 4 :(得分:0)
只需对数组中的数字进行散列,就像计算sort一样。然后取两个变量,首先指向索引0,另一个指向索引2(或一般情况下为索引d)。 现在检查两个索引处的值是否为非零,如果是,则使用两个值中的较大值递增计数器,否则保持计数器不变,因为该对不存在。现在递增两个索引并继续,直到第二个索引到达数组的末尾。计数器的总值是具有差异d的对的数量。 时间复杂度:O(n) 空间复杂度:O(n)