第16题是找一个和target最接近的数,两个指针双层遍历即可:
class Solution(object):
def threeSumClosest(self, nums, target):
result=nums[0]+nums[1]+nums[2]
nums.sort()
for i in range(len(nums)-2):
j,k=i+1,len(nums)-1
while j<k:
x=nums[i]+nums[j]+nums[k]
if x==target:
return target
if abs(x-target)<abs(result-target):
result=x
if x>target:
k-=1
else:
j+=1
return result
第15题,我可以采用同样的方法,这个时候要找的是目标和为0
区别在于:
找到了之后,仍然要遍历完。
不允许重复,我用set来做。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
n=len(nums)
ans=set()#偷工减料用set保证不重复
nums.sort()
for i in range(n-2):
j,k=i+1,n-1
while j<k:
sum=nums[i]+nums[j]+nums[k]
if sum==0:
ans.add((nums[i],nums[j],nums[k]))
j+=1#需要遍历完
elif sum>0:
k-=1
else:
j+=1
return [list(l) for l in ans]