1. 3sum其实和2sum思路差不多。只要把第三个数变成2sum的target就好了。当然要先sort一下,原数组是无序的。
2. 也要考虑重复数组的情况。比如left[i]==left[i-1]说明这个数字在i-1的时候应该考虑过了,需要skip.同理right也是一样。还有一种重复情况是,当target重复的时候,也要skip.
3. 有个特殊情况我一直过不去。[0,0,0],差点用特殊情况if处理了。其实这一步在判断第二点重复target情况的时候可以同时考虑进去。既i>0 and numbers[i]==numbers[i-1].
4. O(N^2)
def sum3(numbers):
numbers.sort() # [-4,-1,-1,0,1,2] [-2,0,0,2,2]
res =[]
for i in range(0,len(numbers)-2):
if i>0 and numbers[i]==numbers[i-1]:
continue
target=numbers[i]*-1
left=i+1
right=len(numbers)-1
while left<right:
if numbers[left]+numbers[right]==target:
res.append([numbers[i], numbers[left], numbers[right]])
left += 1
right -= 1
while left<right and numbers[left]==numbers[left-1]:
left += 1
while left<right and numbers[right]==numbers[right+1]:
right -= 1
elif numbers[left]+numbers[right]>target:
right -= 1
else:
left += 1
return res