找到一对数字,其差别是未排序数组中的输入值'k'

时间:2012-05-04 14:05:31

标签: c arrays performance algorithm

如标题中所述,我想找到差异为 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)中提供解决方案。任何帮助表示赞赏..

3 个答案:

答案 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]是否属实。如果是,则ii+k号码是必需的对
    • 否则继续下一个整数i+1