Cha*_* Ma 40
没有哈希表的O(n ^ 2)解决方案(因为使用哈希表是作弊:P).这是伪代码:
Sort the array // O(nlogn)
for each i from 1 to len(array) - 1
iter = i + 1
rev_iter = len(array) - 1
while iter < rev_iter
tmp = array[iter] + array[rev_iter] + array[i]
if tmp > 0
rev_iter--
else if tmp < 0
iter++
else
return true
return false
Run Code Online (Sandbox Code Playgroud)
基本上使用排序数组,对于数组中的每个数字(目标),使用两个指针,一个从前面开始,一个从数组后面开始,检查指针指向的元素之和是否> ,<或==到目标,并相应地推进指针,或者如果找到目标则返回true.
不是为了信用或任何东西,但这是我的Charles Ma的解决方案的python版本.很酷.
def find_sum_to_zero(arr):
arr = sorted(arr)
for i, target in enumerate(arr):
lower, upper = 0, len(arr)-1
while lower < i < upper:
tmp = target + arr[lower] + arr[upper]
if tmp > 0:
upper -= 1
elif tmp < 0:
lower += 1
else:
yield arr[lower], target, arr[upper]
lower += 1
upper -= 1
if __name__ == '__main__':
# Get a list of random integers with no duplicates
from random import randint
arr = list(set(randint(-200, 200) for _ in range(50)))
for s in find_sum_to_zero(arr):
print s
Run Code Online (Sandbox Code Playgroud)
很久以后:
def find_sum_to_zero(arr):
limits = 0, len(arr) - 1
arr = sorted(arr)
for i, target in enumerate(arr):
lower, upper = limits
while lower < i < upper:
values = (arr[lower], target, arr[upper])
tmp = sum(values)
if not tmp:
yield values
lower += tmp <= 0
upper -= tmp >= 0
Run Code Online (Sandbox Code Playgroud)