题目描述
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。
假定每组输入只存在恰好一个解。
输入数据
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
输入:nums = [0,0,0], target = 1
输出:0
解题思路
本题的解题和上一题三数之和相似,三数之和求的是三个数的和等于给定值,这里求得是三个数的和最接近给定值,比上一题多个一步判断而已
代码实现
#include <iostream>
#include<algorithm>
#include <vector>
#include<stack>
#include <cctype>
#include <stdio.h>
#include <iomanip>
using namespace std;
//方法一:排序+count函数---超时
//方法二:排序+双指针法
int computedis(int a,int b)
{
if(a<b)
{
return b-a;
}
else
{
return a-b;
}
}
int threeSumClosest(vector<int>& nums,int target)
{
int n=nums.size();
int sum=nums[0]+nums[1]+nums[2];
//首先对nums进行排序,减少计算的时间复杂度
sort(nums.begin(),nums.end());
int minsum=sum;
int mindis=computedis(sum,target);
int dis;
for(int i=0; i<n-2; i++)
{
//去重
if(i!=0&&nums[i]==nums[i-1])
continue;
int j=i+1,k=n-1;
while(j<k)
{
sum=nums[j]+nums[k]+nums[i];
dis=computedis(sum,target);
if(sum==target)
{
return sum;
}
else if(sum<target)
{
while(j<k&&nums[j]==nums[j+1])
j++;
j++;
}
else
{
while(j<k&&nums[k]==nums[k-1])
k--;
k--;
}
if(dis<mindis)
{
mindis=dis;
minsum=sum;
}
}
}
return minsum;
}
int main()
{
vector<int> b;
//[4,0,5,-5,3,3,0,-4,-5]
//[2,3,8,9,10]
b.push_back(2);
b.push_back(3);
b.push_back(8);
b.push_back(9);
b.push_back(10);
cout<<threeSumClosest(b,16);
}