题目内容
输入一个数组,例如{-1 0 1 2 -1 -4},从数组中找三个数(a,b,c),使得其和0,输出所有的(a,b,c)组合。
要求abc不能重复,并且a<=b<=c。
例:
S = {-1, 0, 1, 2, -1, -4};
输出:
(-1, 0 ,1)
(-1, -1, 2)
分析
一看到题目,不问代码行数,不问时间复杂度,便排出三个循环。。但是循环非常耗时,显然不是题目的本意。想了好长时间没有什么进展。
先将给定数组排序,然后指定一个数,在数组中找出两个数并且这两个数的和是目标数值的相反数:【LeetCode】3Sum 解题报告
在网上找到了篇比较有新意的文章:[3Sum algorithm - 非常容易理解的实现 (java)] 。
最后发现维基百科中就有收录:维基百科—3SUM ,还有更一般的情形 N SUM。
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.
end = end - 1
else if (a+b+c > 0) then
end = end - 1;
else
start = start + 1;
end
end
end
伪代码还挺容易理解的。
Other
因为知乎上有人宣称证明了哥德巴赫猜想的原因,这两天还特意了解了下猜想证明的历史,“1+2”、“1+3”之类的证明,虽然一点也没看懂。感觉数学真的很有魅力,严谨清晰的逻辑,精妙完美的结论,自然界中的一切每时每刻都在遵循着其中的规律运行,更加感慨于人类的智慧,都找不到合适的赞美的词了。
“超越数”、“黄金分割”、“哥德巴赫猜想”、“黎曼猜想”…
停下思绪,回到现实:当你理解它的时候你觉得进入了天堂,当你不理解它的时候你仿佛进入了地狱,看哭了…