给定排序数组a [0 ... n-1],找到总和小于S的所有数字对。 有没有O(n)解决方案?
答案 0 :(得分:4)
你现在正在接受采访吗?他们很快就回到了房间吗?
由于它已经排序,因此其中一个解决方案(如果有的话)是[0]而某些最高[M]。然后从0向上处理较低的索引,从M向下处理较高的索引。以及有关哪些要碰撞以及何时拒绝的一些细节。
编辑 - 因为仍然可以有O(n ^ 2)个解决方案(例如,如果S的大小是最大条目的两倍),那么一个技巧就是表达解决方案作为范围。否则,只是枚举将花费太长时间。
答案 1 :(得分:0)
这可能会有所帮助:
答案 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。