找到总和小于S的所有数字对

时间:2011-04-11 03:53:46

标签: algorithm

给定排序数组a [0 ... n-1],找到总和小于S的所有数字对。 有没有O(n)解决方案?

5 个答案:

答案 0 :(得分:4)

你现在正在接受采访吗?他们很快就回到了房间吗?

由于它已经排序,因此其中一个解决方案(如果有的话)是[0]而某些最高[M]。然后从0向上处理较低的索引,从M向下处理较高的索引。以及有关哪些要碰撞以及何时拒绝的一些细节。

编辑 - 因为仍然可以有O(n ^ 2)个解决方案(例如,如果S的大小是最大条目的两倍),那么一个技巧就是表达解决方案作为范围。否则,只是枚举将花费太长时间。

答案 1 :(得分:0)

这可能会有所帮助:

Find two no's in an array whose sum =X

答案 2 :(得分:0)

大卫的解决方案应该有效。即使有超过N个解,它也将是O(N)。

1)以* ptr1 = a [0]开始,* ptr2 = a [X]< = S(X不总是N-1)

2)向后移动ptr2直到ptr1 + ptr2 <= S。

- 此时,ptr1 +所有指向ptr2的索引都是解决方案。

3)将ptr2移回一个索引,并将ptr1向上移动一个索引

- 重复

继续,直到ptr1&gt; PTR2

答案 3 :(得分:0)

枚举所有这样的对已经在O(n ^ 2)中(请注意,这与总结到S的问题不同,因为在这种情况下,枚举可以在O(n)中完成,如“3”次对(w,x),1次对(y,z),......“

答案 4 :(得分:0)

没有O(n)解决方案。例如,如果你有一个这样的列表:1,2,3,4 ... n和S = 3 * n那么每个对的总和小于S.并且必须返回的对的数量是n *(n -1)/ 2。