如标题中所述,我想找到差异为 K 的元素对
example k=4 and a[]={7 ,6 23,19,10,11,9,3,15}
output should be :
7,11
7,3
6,10
19,23
15,19
15,11
我已在SO“find pair of numbers in array that add to given sum”
中阅读了之前的帖子为了找到有效的解决方案,需要多长时间?时间复杂度是O(nlogn)
还是O(n)
?
我尝试通过分而治之的技术来做到这一点,但我没有得到退出条件的任何线索......
如果一个有效的解决方案包括对输入数组进行排序并使用两个指针操作元素,那么我认为我应该至少使用O(nlogn)
...
是否有任何数学相关技术可以在O(n)
中提供解决方案。任何帮助表示赞赏..
答案 0 :(得分:22)
您可以使用哈希表在O(n)中执行此操作。将所有数字放入O(n)的哈希值中,然后再次遍历它们以查找number[i]+k
。哈希表在O(1)中返回“是”或“否”,您需要遍历所有数字,因此总数为O(n)。任何具有O(1)设置和O(1)检查时间的集合结构都将起作用而不是哈希表。
答案 1 :(得分:6)
O(n * Log(n))中的一个简单解决方案是对数组进行排序,然后使用此函数遍历数组:
void find_pairs(int n, int array[], int k)
{
int first = 0;
int second = 0;
while (second < n)
{
while (array[second] < array[first]+k)
second++;
if (array[second] == array[first]+k)
printf("%d, %d\n", array[first], array[second]);
first++;
}
}
与具有哈希表的解决方案不同,此解决方案不使用额外空间。
答案 2 :(得分:1)
在O(n)
中使用索引可以完成一件事arr
。i
在输入列表中,然后设置arr[i] = true
arr
从最低整数遍历到最高整数,如下所示:
true
索引处找到i
时,请记下此索引。arr[i+k]
是否属实。如果是,则i
和i+k
号码是必需的对i+1