题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一(暴力法)
- 思路
直接做三层循环,寻找最接近的值输出 - 代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
lens=len(nums)
res=100000
for p1 in range(lens-2):
p2=p1+1
while p2<lens-1:
p3=p2+1
while p3<lens:
isum=nums[p1]+nums[p2]+nums[p3]
if abs(isum-target)<abs(res-target):
res=isum
if res==target:
return target
p3+=1
p2+=1
return res
- 结果
解法二(双指针)
- 思路
直接运用第15题的框架
双指针+重复的数跳过
p.s. 因为不要求找出是哪几个数相加,所以当sum等于target时,直接返回target - 代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
lens=len(nums)
res=1000000
for p1 in range(lens-2):
if p1>0 and nums[p1]==nums[p1-1]:
continue
p2=p1+1
p3=lens-1
while(p2<p3):
isum=nums[p1]+nums[p2]+nums[p3]
if isum==target:
return target
if abs(target-isum)<abs(target-res):
res=isum
elif isum<target:
p2+=1
while p2<p3 and nums[p2]==nums[p2-1]:
p2+=1
else:
p3-=1
while p2<p3 and nums[p3]==nums[p3+1]:
p3-=1
return res
- 结果