第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]