一、首先想到的思路,最简单暴力,设置三重循环搜索
1.对原数组按从小到大进行排序
2.将要返回的变量初始化为前三个数的和
3.开始循环
(1)若和更接近目标值,则更新要返回的变量
(2)由于现在数组已经按照从小到大顺序排列了,可以做以下检测:
i)若和已经等于目标值,则直接返回该数值
ii)若和大于目标值,则可以跳出本层循环(在排序的数组中,和会随着遍历的过程增大,和小于目标值,继续遍历,会接近目标值,大于目标值,继续遍历就会离目标起来越远)
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int n=nums.size(),ans,delta,tmp;
ans=nums[0]+nums[1]+nums[2];
delta=abs(ans-target);
if(delta==0)
return ans;
for(int i=0;i<n-2;i++)
{
for(int j=i+1;j<n-1;j++)
{
for(int k=j+1;k<n;k++)
{
tmp=nums[i]+nums[j]+nums[k];
if(abs(tmp-target)<delta)
{
ans=tmp;
delta=abs(ans-target);
if(delta==0)
return ans;
}
if(tmp>target)
break;
}
}
}
return ans;
}
};
二、参考第15题做法,先排序,并用双指针,当和小于目标值,则移动左边的指针,大于,则移动右边的
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target)
{
sort(nums.begin(),nums.end());
int ans=nums[0]+nums[1]+nums[2],delta=abs(ans-target),len=nums.size(),low,high,tmp;
for(int i=0;i<len-2;i++)
{
low=i+1;
high=len-1;
while(low<high)
{
tmp=nums[i]+nums[low]+nums[high];
if(abs(tmp-target)<delta)
{
ans=tmp;
delta=abs(ans-target);
}
if(tmp<target)
low++;
else
high--;
}
}
return ans;
}
};