给定一个整数数组A,找到任何三个与任何给定T相加的结构。
我在一些在线帖子上看到了这一点,声称它有一个O(NlogN)解决方案。
对于2个数字,我知道散列表可以帮助O(N),但对于3个数字,我找不到一个。
我也觉得这个问题听起来很熟悉一些难题,但不记得这个名字,因此不能谷歌。 (虽然最坏的显然是O(N ^ 3),并且对于2个数字的解,它实际上是O(N ^ 2))
它并没有真正解决现实世界中的任何事情,只是让我感到烦恼..
有什么想法吗?
答案 0 :(得分:14)
我认为您的问题等同于3SUM problem.
答案 1 :(得分:3)
对于三和问题,你找不到比O(n ^ 2)更好的解法。您可以参考http://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science
答案 2 :(得分:2)
2SUM问题可以在O(nlgn)时间内解决。
首先对最多需要O(nlgn)操作的数组进行排序。现在在第i次迭代中,我们选择了元素a[i]
并在数组的其余部分找到了元素-a[i]
(即从i+1
到n-1
),这个搜索可能是在二进制搜索中进行,最多花费lgn时间。总的来说,它需要O(nlgn)操作。
但是3SUM问题无法在O(nlgn)时间内解决。我们可以将它减少到O(n ^ 2)
答案 3 :(得分:0)
听起来像是一个家庭作业问题......
如果您可以找到两个总和为 N 的值,但是您希望将搜索范围扩展到三个值,那么对于集合中的每个值 M ,您都不能,找两个总和为(N - M)的值?如果在O(log N)时间内找到两个与特定值相加的值,则该值为O(N log N)。
答案 4 :(得分:0)
答案 5 :(得分:-2)
直接从https://en.wikipedia.org/wiki/3SUM
取消 sort(S);
for i=0 to n-3 do
a = S[i];
start = i+1;
end = n-1;
while (start < end) do
b = S[start];
c = S[end];
if (a+b+c == 0) then
output a, b, c;
// Continue search for all triplet combinations summing to zero.
start = start + 1
end = end - 1
else if (a+b+c > 0) then
end = end - 1;
else
start = start + 1;
end
end
end