数组中两个整数的和等于K.

时间:2013-10-04 07:02:35

标签: algorithm

我认为Find two elements in an array that sum to kHow can I find two elements in an array that sum to k是相关的。

我知道一个O(n)解决方案,但我发现O(n logn)也存在: -

p=0,q=n-1;
while(p<q)
{
  if(a[p]+a[q]==k)
  {
      cout<<a[p]<<"\t"<<a[q];
      p++;
      q--;
   }
   else if(a[p]+a[q]>k)
      q--;
   else 
      p++;
}

这需要首先对数组进行排序。但由于p和q的值取决于数组中的元素,我们如何断言该算法的复杂度为O(n Log n)?

3 个答案:

答案 0 :(得分:1)

高效排序算法的复杂性为O(n log n)

无论pq以何种方式发生变化,while周期都会遍历数组中的所有元素一次,因此它的复杂性为O(n)

将两者加在一起:O(n log n) + O(n) = O(n log n + n) = O(n log n),因为当n log n是一个很大的数字时,n远小于n

答案 1 :(得分:0)

如果你有一个O(n)解决方案,除非O(n log n)解决方案有O(n),否则你不需要关心O(n^(n^(n^n)))一个,因为更糟,其他一些问题,如像O(n)这样的大规模空间复杂性: - )

在任何情况下,您显示的算法也是O(n log n),因为您要么在每次迭代时增加低索引,要么降低高索引。

我怀疑你提到的{{1}}首先包含了一些初始未排序的数据,因为这是排序的典型时间复杂度。

答案 2 :(得分:0)

在python中

arr = [1, 2, 4, 6, 10]
diff_hash = {}
expected_sum = 3
for i in arr:
    if diff_hash.has_key(i):
        print i, diff_hash[i]
    key = expected_sum - i
    diff_hash[key] = i

ALGO:

Input: expected_sum

diff_hash = hashtable_datastructure
for(i=0, i<len(arr), i++)
{ 
   if(diff_hash(arr[i])) 
   { 
      return arr[i] , diff_hash(arr[i])
   } 
   key = expected_sum - arr[i] 
   diff_hash(key) = arr[i] 
 }