给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
solution 1
躲得过[0,0,0],躲得过[0,0,0,0],躲不过超时啊
import operator
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result = []
for i in range(0, len(nums)):
if nums[i] == nums[i-1] and nums[i] != 0:
continue
for j in range(i+1, len(nums)):
a = nums[i]
b = nums[j]
c = -a-b
nn = nums[j+1:len(nums)]
if c in nn:
temp = (a, b, c)
if len(result) == 0:
result.append(temp)
if not operator.eq(result[-1], temp):
result.append(temp)
return result
solution 2
1.将数组排序
2.定义三个指针,i,j,k。遍历i,那么这个问题就可以转化为在i之后的数组中寻找nums[j]+nums[k]=-nums[i]这个问题,也就将三数之和问题转变为二数之和---(可以使用双指针)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result = []
for i in range(len(nums)):
if nums[i] > nums[i-1] or i == 0:
l = i+1
r = len(nums)-1
while(l<r):
s = nums[i] + nums[l]+nums[r]
if s==0:
result.append([nums[i] , nums[l],nums[r]])
l += 1
r -= 1
while l<r and nums[l-1]==nums[l]:
l+=1
while l<r and nums[r+1]==nums[r]:
r-=1
elif s>0:
r-=1
else:
l+=1
return result
执行用时 : 1036 ms, 在3Sum的Python3提交中击败了75.65% 的用户
内存消耗 : 16.7 MB, 在3Sum的Python3提交中击败了74.16% 的用户