查找数组中具有's'差异的所有对

时间:2017-07-29 18:46:00

标签: arrays algorithm time-complexity

我有一个长度为 n 的数组,其中的整数范围为 [0,n ^ 5] 。我想在数组中找到所有对,它们之间的差异是值 s 的给定整数变量(例如对于数组中的整数a,b,我们如果满足给定的要求,将具有ab = s或ba = s。

找到所有对的最佳确定性算法(即不使用hashset或类似性)是什么?我可以用 O(n)时间复杂度来做吗?

我的想法是首先在O(n)时间内使用Radix-Sort对数组进行排序,然后以某种方式使用数组排序的事实找到所有对 但我不确定如何实施它。

感谢。

2 个答案:

答案 0 :(得分:2)

一旦数组按基数排序(假设输入提供复杂度O(n)),你可以使用双指针方法,其中p1和p2都在数组的开头,你迭代数组直到p2<数组中的元素数

粗伪代码..

while p2 < array.length && p1 < array.length
  if array[p2] - array[p1] == k
    increment count of unique pairs
    increment p1
    increment p2
  else if array[p2] - array[p1] > k
    increment p1
  else 
    increment p2
  end
end

编辑: 负{s}的p1 < array.length

答案 1 :(得分:0)

另一种方法是使用整数计数构建哈希表。然后,对于散列表中的每个键a,您可以检查是否存在[s + a]。对我来说,这似乎比排序更有效,但应该在n上测试不同的大小。