我有一个长度为 n 的数组,其中的整数范围为 [0,n ^ 5] 。我想在数组中找到所有对,它们之间的差异是值 s 的给定整数变量(例如对于数组中的整数a,b,我们如果满足给定的要求,将具有ab = s或ba = s。
找到所有对的最佳确定性算法(即不使用hashset或类似性)是什么?我可以用 O(n)时间复杂度来做吗?
我的想法是首先在O(n)时间内使用Radix-Sort对数组进行排序,然后以某种方式使用数组排序的事实找到所有对 但我不确定如何实施它。
感谢。
答案 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上测试不同的大小。