题目如下:
解题思路:
思路同求三数之和,仍旧是将数组排序后,将三个数的问题转化为两个数的问题。固定基数 base ,然后用双指针 left 和 right 向中间移动查找。
代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int res = 0;
int temp = INT_MAX;
//先将数组排序(升序)
sort(nums.begin(), nums.end());
//将三个数的问题转换为两个数的问题,固定基数,找另外两个满足条件的数
for(int base = 0; base < nums.size(); base++)
{
//跳过相同元素
if(base > 0 && nums.at(base) == nums.at(base - 1))
continue;
//头尾两个指针进行扫描,因为数组已排序,可以从base后面扫描,避免重复组合
int left = base + 1;
int right = nums.size() - 1;
while(left < right)
{
int tt = nums.at(base) + nums.at(left) + nums.at(right);
//若base+left+right > sum,则应减小,right左移
if(tt > target){
if(abs(tt - target) < temp){ //更接近则记录
temp = abs(tt - target);
res = tt;
}
right--;
}
//若base+left+right < sum,则应增加,left右移
else if(tt < target){
if(abs(tt - target) < temp){ //更接近则记录
temp = abs(tt - target);
res = tt;
}
left++;
}
//相等则完全接近,直接返回
else if(tt == target)
return tt;
}
}
return res;
}
};