【问题标题】:Sum of two integers in an array equals K数组中两个整数之和等于 K
【发布时间】:2013-10-04 07:02:35
【问题描述】:

我阅读了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)呢?

【问题讨论】:

  • O(n log n) 时间包括排序。
  • 在我看来,这个算法的复杂度为 O(n),因为在每次迭代中,您至少要增加或减少一个计数器。

标签: algorithm


【解决方案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 远小于n log n,而n 是一个很大的数字。

【讨论】:

    【解决方案2】:

    如果您有O(n) 解决方案,则无需担心O(n log n) 解决方案,因为这更糟糕, 除非O(n) 解决方案有其他问题,例如大规模空间复杂度如O(n^(n^(n^n))) :-)

    无论如何,您展示的算法也是O(n),因为您在每次迭代时要么增加低索引,要么减少高索引。

    我怀疑你提到的O(n log n) 首先包含一个初始排序的未排序数据,因为这是排序的典型时间复杂度。

    【讨论】:

      【解决方案3】:

      在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
      

      算法:

      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] 
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 2016-09-09
        • 2015-07-07
        相关资源
        最近更新 更多