链接:https://leetcode-cn.com/problems/3sum/
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
使用三重循环进行暴力破解,时间复杂度为O(n^3),空间复杂度O(1),这里不再赘述。
暴力解法的时间复杂度太高了,所以我们需要思考如何优化。根据题意我们可以知道,首先需要使得 a + b + c = 0,其次不能有重复解。
根据不能有重复解这个条件,我们可以想到,如果我们对数组进行一个排序,那么相同的元素在数组中的位置就变成相邻的,这时我们就可以增加一个判断:当相邻元素相同时,我们就可以跳过一次遍历,这样就可以排除重复解。
在暴力解法中,我们是通过三重循环来实现的,那我们顺理成章就想到了,可以把三重循环变成二重循环啊,同时在循环中设置两个指针,一个从前到后,一个从后往前,来使得 a+b+c=0。
思路:
时间复杂度:O(n^2),数组排序为 O(nlogn),循环为 O(n^2),所以最终为 O(n^2)
空间复杂度:O(1)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n=len(n)
if not nums or n<3:
return
nums.sort()
res=[]
for k in range(n):
if k>0 and nums[k]==nums[k-1]:
continue
i,j=k+1,n-1
while i<j:
sum=nums[k]+nums[i]+nums[j]
if sum==0:
tmp=[nums[k],nums[i],nums[j]]
res.append(tmp)
while i<j and nums[i]==nums[i+1]:
i+=1
while i<j and nums[j]==nums[j-1]:
j-=1
i+=1
j-=1
elif sum<0:
i+=1
else:
j-=1
return res
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。