确定总和为数组中某个值的整数对

时间:2015-11-07 12:22:49

标签: algorithm

我有一个程序,它计算总和为value的N个整数对的数量。为简化问题,还假设整数是不同的。

l.Sort();
for (int i = 0; i < l.Count; ++i)
{
     int j = l.BinarySearch(value - l[i]);
     if (j > i)
     {
        Console.WriteLine("{0} {1}", i + 1, j+1);
     }
}

要解决此问题,我们对数组进行排序(以启用二进制搜索),然后对于数组中的每个条目a[i],对value - a[i]进行二进制搜索。如果结果是带有j的索引j > i,我们会显示此对。

但是这个算法不适用于以下输入:

1 2 3 4 4 9 56 90因为j总是小于i

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我会选择需要更多空间的更有效的解决方案。

假设数字不明显

  1. 创建一个哈希表,其中整数为键,频率为值
  2. 迭代这个哈希表。
  3. 每个键
    • 计算差异diff = value - k
    • 在哈希
    • 中查找diff
    • 如果匹配,请检查此值是否已获得频率&gt; 0
    • 如果频率> 0将其递减1并产生当前对k, diff
  4. 这是一个Python代码:

    def count_pairs(arr, value):
      hsh = {}
      for k in arr:
        cnt = hsh.get(k, 0)
        hsh[k] = cnt + 1
      for k in arr:
        diff = value - k
        cnt = hsh.get(diff)
        if cnt > 0:
          hsh[k] -= 1
          print("Pair detected: " + str(k) + " and " + str(diff))
    
    count_pairs([4, 2, 3, 4, 9, 1, 5, 4, 56, 90], 8)
    #=> Pair detected: 4 and 4
    #=> Pair detected: 3 and 5
    #=> Pair detected: 4 and 4
    #=> Pair detected: 4 and 4
    

    至于counts the number of pairs非常模糊的描述,在这里你可以看到4个不同的(按数字&#39; s索引)对。

答案 1 :(得分:1)

如果您希望这适用于 -distinct值(您的 问题不说,但你的评论意味着),二元搜索只有 i之后的数组部分。这也消除了对的需要 if (j > i)测试。

会显示代码,但我不知道如何指定这样的切片 无论你使用什么语言。