我有一个程序,它计算总和为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
。
如何解决这个问题?
答案 0 :(得分:2)
我会选择需要更多空间的更有效的解决方案。
假设数字不明显
diff = value - k
diff
k, diff
这是一个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)
测试。
会显示代码,但我不知道如何指定这样的切片 无论你使用什么语言。