给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#暴力超时
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n=len(nums)
ans=10**8
total=0
for i in range(n):
for j in range(i+1,n):
for k in range(j+1,n):
total=nums[i]+nums[j]+nums[k]
if abs(total-target)<abs(ans-target):
ans=total
return ans
#排序 双指针 O(n^2)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n=len(nums)
ans=10**8
for i in range(n):
p1=i+1
p2=n-1
while(p1<p2):
s=nums[i]+nums[p1]+nums[p2]
if abs(s-target)<abs(ans-target):
ans=s
if s==target:
return target
if s>target:
p2-=1
else:
p1+=1
return ans
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n=len(nums)
ans=10**8
for i in range(n):
#保证下次从不同的数开始
if (i>0 and nums[i]==nums[i-1]):
continue
p1=i+1
p2=n-1
while(p1<p2):
s=nums[i]+nums[p1]+nums[p2]
if s==target:
return target
if abs(s-target)<abs(ans-target):
ans=s
if s>target:
# 得到不同的值
while(p2>p1 and nums[p2]==nums[p2-1]):
p2-=1
p2-=1
else:
while(p1<p2 and nums[p1+1]==nums[p1]):
p1+=1
p1+=1
return ans