leetcode15 三数之和
Problem:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
Answer:
类似于16题:最接近的三数之和,但是需要去除重复的三元组。
首先对数组进行排序,然后对于固定的下标i(0到size - 1),用双指针对i右侧的数进行搜索,注意当三数之和等于0时,还要继续搜索,
如[0, -2, -1, 1, 2],(0, -2, 2)和(0, -1, 1)和都为0.
避免重复:
当nums[i] == nums[i - 1]或nums[left] == nums[left - 1]或nums[right] == nums[right + 1]时,跳过即可。
另外当nums[i] > 0时,由于排序后i后面的数更大,所以和肯定大于0。
Code:
1 class Solution: 2 def threeSum(self, nums: List[int]) -> List[List[int]]: 3 res = [] 4 nums.sort() 5 nums_len = len(nums) 6 for i in range(nums_len): 7 if nums[i] > 0: 8 break 9 if i > 0 and nums[i] == nums[i - 1]: 10 continue 11 left = i + 1 12 right = nums_len - 1 13 while left < right: 14 if left > i + 1 and nums[left] == nums[left - 1]: 15 left += 1 16 continue 17 if right < nums_len - 1 and nums[right] == nums[right + 1]: 18 right -= 1 19 continue 20 sum_ = nums[i] + nums[left] + nums[right] 21 if sum_ == 0: 22 res.append([nums[i], nums[left], nums[right]]) 23 left += 1 24 right -= 1 25 elif sum_ > 0: 26 right -= 1 27 else: 28 left += 1 29 return res
Reference:
https://leetcode-cn.com/problems/3sum/solution/3sumpai-xu-shuang-zhi-zhen-yi-dong-by-jyd/