本题要求从给定的列表里面找出三个和为0的数。
解题:考虑先找一个数再找两个数的方法。首先给列表排序,从小到大的顺序。如果列表中的第一个数字大于0或者最后一个数字小于0就没有找的必要了。在定下一个数字后,再从该数后面的数中找到两数,这里要注意用从两边向中间寻找的方式。
代码:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
if not nums or nums[0]>0 or nums[-1]<0:
return []
res=[]
l=len(nums)
for i in range(l):
if i>0 and nums[i-1]==nums[i]:#如果和前一个数相同,则跳过。
continue
if nums[i]>0:#遍历到大于0的时候就无法找到三数和为0了,跳过。
break
left,right=i+1,l-1
while right>left:
if nums[i]+nums[left]+nums[right]==0:
res.append([nums[i],nums[left],nums[right]])
while right>left and nums[right-1]==nums[right]:
right-=1
while right>left and nums[left+1]==nums[left]:
left+=1
right-=1
left+=1
elif nums[i]+nums[left]+nums[right]<0:
left+=1
else:
right-=1
return res