题目
给你一个包含 n
个整数的数组 nums
,判断 nums
中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?请你找出所有和为 0
且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路
- 遍历整个数组,对每一个数都判断是否存在另外两个数与其和为0
- 对于选中的数 x x x,若数组已排序,则可以将两个指针指向数组最大和最小值,若和大于0则大指针左移,反之小指针右移
- 为了减小重复次数,可以从 x x x右侧开始遍历
- 使用一个集合保存结果,以去重
- LeetCode似乎提供了Tuple直接转List的机制,所以直接return list(result set)
代码
from typing import List
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return []
res = set()
nums.sort()
for pos, x in enumerate(nums):
i, j = pos+1, len(nums)-1
while i < j:
if x + nums[i] + nums[j] > 0:
j -= 1
elif x + nums[i] + nums[j] < 0:
i += 1
else:
res.add((x, nums[i], nums[j]))
i += 1
return list(res)
复杂度
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( n ) O(n) O(n)