题目要求
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
解题思路
如果是用蛮力便利的话那么将会三次方的时见复杂度,所以我们想个办法:
首先,先对无序数组进行排序,之后固定一个值,依次去寻找剩下的两个值就是使得三数相加为0的情况,这里的小技巧:
剩下的两个值分别初始为固定值的后一位,以及整体最后一位(方便类似二分法的减小搜索空间),排序还有一个好处,当我们知道目前的三数值和大于0或者小于0时,我们就可以对应的调整两个指针需要注意的是,题目中不允许重复的结果出现,所以,在我们移动指针的时候发现本次移动的结果和未移动之前是一样的就继续移动
主要代码python
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 先排序
nums.sort()
res = []
for i in range(len(nums)):
if i == 0 or nums[i] != nums[i-1]:
l = i + 1
r = len(nums) - 1
while l<r:
s = nums[i] + nums[l] + nums[r]
if s == 0:
res.append([nums[i], nums[l], nums[r]])
l += 1
r -= 1
# 避免进行重复添加,现元素和之前元素比较
while l<r and nums[l] == nums[l-1]:
l+=1
# 避免进行重复添加,现元素和之前元素比较
while l<r and nums[r] == nums[r+1]:
r-=1
elif s>0:
r -= 1
else:
l +=1
return res