Leetcode地址:15. 三数之和 - 力扣(LeetCode) (leetcode-cn.com)
1.暴力法 三层循环
时间复杂度O(n^3)
空间复杂度O(1)
2.哈希表法
遍历第一层,第二层和第三层按两数之和去寻找,在结果中去重。
时间复杂度O(n^2)
空间复杂度O(n)
3.排序+双指针
先排序,如何遍历第一层,第二层第三层按两数之和去寻找,无需再去重
时间复杂度O(nlogn+n^2)
空间复杂度O(n)
本题麻烦其实不是在寻找三数之和为target的解,麻烦在于要找“无重复”的解。
所以排序+双指针应为最优解。
代码如下:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res=[]
nums.sort()
for i in range(len(nums)-2):
if i>0 and nums[i]==nums[i-1]:
continue
l,r=i+1,len(nums)-1
while l<r:
s=nums[i]+nums[l]+nums[r]
if s<0:
l+=1
elif s>0:
r-=1
else:
res.append([nums[i],nums[l],nums[r]])
while l<r and nums[l]==nums[l+1]:
l+=1
while l<r and nums[r]==nums[r-1]:
r-=1
l+=1
r-=1
return res