题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路
给定一个数列a+b+c=0,求的问题可以转换为求a+b=-c:, 我们将输入的list排序后,给定nums[i], 我们需要寻找 nums[j]+nums[k] = - nums[i], 这里的 。
题目要求不可包含重复的解,对于排序后的数组,如果num[i] = num[i+1],那么他们获得的nums[j]和nums[k]肯定是相同的(如果解存在的话),所以应该跳过这种情况。同理,如果num[j] = num[j+1], 那么也会找到相同的nums[k]。这种情况也应该跳过。
class Solution:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
#存储结果列表
res=[]
#对nums列表进行排序,无返回值,排序直接改变nums顺序
nums.sort()
# 对排序后的nums进行遍历
for i in range(len(nums)):
#如果排序后第一个数都大于0,则跳出循环,不可能有为0 的三数之和
if nums[0]>1:
break
# 排序后相邻两数如果相等,则跳出当前循环继续下一次循环,相同的数只需要计算一次
if i>0 and nums[i]==nums[i-1]:
continue
#记录i的下一个位置
j=i+1
#最后一个元素的位置
k=len(nums)-1
while j<k:
#判断三数之和是否为零
if nums[j]+nums[k] ==-nums[i]:
#把结果加入数组之中
res.append([nums[i],nums[j],nums[k]])
#判断j相邻元素是否相等,有的话直接跳过这个
while j<k and nums[j] ==nums[j+1]:
j+=1
while j<k and nums[k]==nums[k-1]:
k-=1
#没有相等则j+1,k-1,缩小范围
j+=1
k-=1
#小于-nums[i]的话还能继续往后取
elif nums[j]+ nums[k] < -nums[i] :
j +=1
else:
k-=1
return res