给定n,k和n个整数。你如何找到它们的差值为k的整数对?
有一个n*log n
解决方案,但我无法理解。
答案 0 :(得分:4)
你可以这样做:
data[i]
,确定其两个目标对,即data[i]+k
和data[i]-k
data[i]
和data[targetPos]
添加到输出中。排序在O(n*log n)
完成。每个n
搜索步骤都需要2 * log n
时间来查找目标,总时间为O(n*log n)
答案 1 :(得分:4)
对于这个问题,存在线性解决方案!问问自己一个问题。如果你有a
数组中应该有多少个数字?当然a+k
或a-k
(特殊情况:k = 0
,需要另一种解决方案)。那么,现在呢?
Is present in the array (x+k) or (x-k)?
。你检查每个元素,在 O(1)中设置,你检查每个元素一次,所以它是线性( O(n) )。x
配对(x+k
/ x-k
),那就是您要找的。 li>
所以它是线性( O(n))。如果你真的想要 O(n lg n)你应该在树上使用一个集合,并在(lg n)中检查is_exist
,那么你就 O(n lg n)算法。
合并:无需检查x+k
和x-k
,只需x+k
即可。因为如果a
和b
配对良好,那么:
if a < b then
a + k == b
else
b + k == a
改进:如果您知道某个范围,则可以使用bool表(set_tab[i] == true
,当i
在表格中时)来保证线性复杂性。)
答案 2 :(得分:3)
与上述类似的解决方案:
i = 0; j = 1;
array[i]
和array[j]
j
i
j
排序为O(n*lg n)
,下一步是,如果我是正确的,O(n)
(最多2 * n次比较),那么整个算法为O(n*lg n)