一、题目
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
二、思路
1、首先对数组进行排序,这样可以方便我们使用双指针技巧来查找和为 0 的三元组。
2、遍历排序后的数组,固定第一个数字 nums[i]。
3、使用双指针 left 和 right 分别指向 i+1 和数组末尾,尝试找到满足条件的第二个和第三个数字。
4、如果三数之和小于 0,说明需要增加第二个数字的值,因此将 left 右移;如果大于 0,说明需要减少第三个5、数字的值,因此将 right 左移。
6、如果找到和为 0 的三元组,添加到结果中,并跳过重复的元素。
7、最后返回所有和为 0 的不重复三元组。
三、解法
class Solution:def threeSum(self,nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft, right = i + 1, len(nums) - 1while left < right:s = nums[i] + nums[left] + nums[right]if s > 0:right -= 1elif s < 0:left += 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return resultif __name__ == '__main__':nums =[-2,-1,-3,0,1,2,3,4]solution = Solution()result = solution.threeSum(nums)print(result)
```python
def threeSum(nums):
```
定义一个名为 `threeSum` 的函数,它接受一个整数数组 `nums` 作为参数。```pythonnums.sort()
```
对输入的 `nums` 数组进行排序。这样做的好处是可以使用双指针技巧来查找和为 0 的三元组。```pythonresult = []
```
初始化一个空列表 `result`,用于存储所有和为 0 的不重复三元组。```pythonfor i in range(len(nums) - 2):
```
遍历排序后的 `nums` 数组,固定第一个数字 `nums[i]`。由于我们需要找到三个不同的数字作为三元组,所以只需要遍历到倒数第三个元素。```pythonif i > 0 and nums[i] == nums[i - 1]:continue
```
跳过重复的第一个数字。这样可以避免在结果中出现重复的三元组。```pythonleft, right = i + 1, len(nums) - 1
```
初始化双指针 `left` 和 `right`,分别指向 `i+1` 和数组末尾。```pythonwhile left < right:
```
开始使用双指针技巧查找和为 0 的三元组。```pythontotal = nums[i] + nums[left] + nums[right]
```
计算当前三元组的和。```pythonif total == 0:result.append([nums[i], nums[left], nums[right]])
```
如果三元组的和为 0,添加它到结果列表中。```pythonwhile left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1
```
跳过重复的第二个和第三个数字。这样可以避免在结果中出现重复的三元组。```pythonelif total < 0:left += 1
```
如果三元组的和小于 0,说明需要增加第二个数字的值,因此将 `left` 右移。```pythonelse:right -= 1
```
如果三元组的和大于 0,说明需要减少第三个数字的值,因此将 `right` 左移。```pythonreturn result
```
最后返回所有和为 0 的不重复三元组。