1、自己想法,暴力
超时
难点:去重
按照题目给的答案来看只能先排序,才能给出与之一样顺序的答案。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
numsLen = len(nums)
target = [[0 for i in range(numsLen)] for j in range (numsLen)]
result = []
for i in range(numsLen):
for j in range(i+1, numsLen):
target[i][j] = nums[i] + nums[j]
for k in range(j+1, numsLen):
flag = 1
if (nums[k] + target[i][j] == 0): #查重
for ind in range(len(result)):
if (nums[k] == result[ind][2]):
if (nums[i] == result[ind][0] or nums[i] == result[ind][1]):
flag = 0
break
if (flag == 1):
index = [nums[i], nums[j], nums[k]]
result.append(index)
return result
2、官方解答 排序+双指针
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
numsLen = len(nums)
result=[]
for k in range(numsLen):
if nums[k] > 0: # 之后都大于0,结束循环
break
if k>0 and nums[k] == nums[k-1]: # 去重
continue
i, j = k+1, numsLen-1
while i < j :
s = nums[k] + nums[i] + nums[j]
if s < 0:
i += 1
while i < j and nums[i] == nums[i-1]: # 跳过所有与当前nums[i]相同的值
i += 1
elif s > 0:
j -= 1
while i < j and nums[j] == nums[j+1]:
j -= 1
else:
temp = [nums[k],nums[i],nums[j]]
result.append(temp)
i += 1
j -= 1
while i < j and nums[i] == nums[i-1]:
i += 1
while i < j and nums[j] == nums[j+1]:
j -= 1
return result