题目
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0
nums[1] + nums[2] + nums[4] = 0+ 1 + (-1) = 0
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0
不同的三元组是 [-1,0,1] 和 [-1,-1,2]
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 排序+暴力
超出时间限制
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
# print(nums)
li = []
# 三次循环遍历
for i in range(len(nums) - 2):
for j in range(i + 1, len(nums) - 1):
for k in range(j + 1, len(nums)):
if nums[i] + nums[j] + nums[k] == 0 and [nums[i], nums[j], nums[k]] not in li :
li.append([nums[i], nums[j], nums[k]])
return li
2. 排序+双指针
执行用时:4840 ms, 在所有 Python 提交中击败了7.84%的用户
内存消耗:18.6 MB, 在所有 Python 提交中击败了95.04%的用户
通过测试用例:
312 / 312
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 列表排序
nums = sorted(nums)
# 获取长度
ln = len(nums)
# 初始化答案
res = []
# for loop 遍历第一个数
for i in range(ln):
# 第二个数从第一个后面一位开始,第三个数从最后开始
l,r = i+1,ln-1
# 双指针查找
while l < r:
# 三个数的总和
sumN = nums[i] + nums[l] + nums[r]
# 如果总和为0
if sumN == 0:
# 判断是否已经在res中出现过,如果已经出现过,则不添加,换言之没现才添加
if [nums[i],nums[l],nums[r]] not in res:
res.append([nums[i],nums[l],nums[r]])
# 继续查找,直到l<r
r-=1
l+=1
# 总和大于零,说明值大了
# 因为是已经排序了的列表,所以第三个数往左移动可以减小总和
elif sumN > 0:
r -= 1
# 同理,值小了就让l往右移动
else:
l += 1
# 返回答案
return res
3. 优化