首先很容易想到的是三层循环遍历,时间复杂度o(n^3),但是会超时,然后一般能想到的是通过排序来优化,排序的复杂度为o(nlogn),然后通过双指针遍历,总体复杂度为o(n^2),但是在实现上有很多细节可以优化,三个指针从左到右为k,i,j,升序排列为例,有
1.当nums[k]>0时,跳过k,因为nums[j]>nums[i]>nums[k]>0,三者相加必大于零
2.当nums[k]与nums最后两个数相加<0时可以跳过,因为nums[k]与数组中任何两个数相加必小于零
3.结合两数之和的可以加入哈希表的思想
下面贴一神仙算法
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums_hash = {}
result = list()
nums.sort()
for num in nums:
nums_hash[num] = nums_hash.get(num, 0) + 1
if 0 in nums_hash and nums_hash[0] >= 3:
result.append([0, 0, 0])
neg = list(filter(lambda x: x < 0, nums_hash))
pos = list(filter(lambda x: x>= 0, nums_hash))
for i in neg:
for j in pos:
dif = 0 - i - j
if dif in nums_hash:
if dif in (i, j) and nums_hash[dif] >= 2:
result.append([i, j, dif])
if dif < i or dif > j:
result.append([i, j, dif])
return result
参考:https://blog.csdn.net/TeFuirnever/article/details/89231965