题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
链接:https://leetcode-cn.com/problems/3sum
解题思路: 排序 + 双指针
指针i:指向数组头部 指针j:指向数组尾部 数组ans: 存储满足三数之和为0的三元组集合 (1) 对数组排序 (从小到大); (2) 遍历数组nums; a. 首先判断排序后数组第一个值得大小,若大于0,则直接返回[]即可; b. 之后排除排序后重复元素,若当前值与下一个值相等,直接进入下一循环; c. 为指针i,j 赋值; d. 不断移动指针,执行循环,直到i==j; - 若当前三数之和为0,则将当前三元组加入结果集ans中,并且移动i,j指针; - 若当前三数之和大于0,向前移动指针j; - 若当前三数之和小于0,向后移动指针; (3) 返回结果res;
代码实现:
def threeSum(self, nums):
n = len(nums)
ans = []
nums.sort()
for k in range(n) :
if nums[k] > 0 :
return ans
if (k > 0 and nums[k] == nums[k - 1]):
continue
i = k + 1
j = n - 1
while i < j :
if nums[k] + nums[i] + nums[j] == 0:
ans.append([nums[k],nums[i],nums[j]])
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 nums[k] + nums[i] + nums[j] > 0 :
j -= 1
else:
i += 1
return ans