描述
< 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例子
思路
同三数之和(for循坏内,两个指针【还要先排序,为了方便移动指针】),但是要注意优化加速
答案
- python
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res=nums[0]+nums[1]+nums[2]
n=len(nums)
for i in range(len(nums)-2):
g=nums[i]+nums[i+1]+nums[i+2]
if g>=target: #越界问题,加速,大于,之后更大,就直接返回
if abs(g-target)<abs(res-target):
res=g
return res
h=nums[i]+nums[n-1]+nums[n-2]
if h==target: return h
if h<target: #加速,小于,之后更大,还可以靠近
res=nums[i]+nums[n-1]+nums[n-2]
continue
a=i+1
b=len(nums)-1
while a<b:
t=nums[i]+nums[a]+nums[b]
if abs(t-target)<abs(res-target):
res=t
if t<target: a+=1
if t>target: b-=1
if t==target: return t
return res
- c++
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int res = nums[0]+nums[1]+nums[2];
int n=nums.size();
for (int i=0; i<n-2; i++)
{
int g=nums[i]+nums[i+1]+nums[i+2];
if (g>=target)
{
if (abs(g-target)<abs(res-target))
res=g;
return res;
}
int h = nums[i]+nums[n-1]+nums[n-2];
if (h<target)
{
res=h;
continue;
}
if (h==target) return h;
if (i-1>0 && nums[i]==nums[i-1]) continue;//去重
int a=i+1,b=n-1;
while (a<b)
{
int t = nums[i]+nums[a]+nums[b];
if (abs(t-target)<abs(res-target))
res=t;
if (t<target) a++;
if (t>target) b--;
if (t==target) return t;
}
}
return res;
}
};