解析:思想类似于3sum,同样采用从两边往中间靠拢的原理
1.对数组进行排列,固定住左右两边的值,设置一个下标代表当前的位置,从左往右依次探索
2.若当前3个数的和小于目标值target,即表示当前位置离目标值还有距离,下标往右移动,直到当前位置的值比之前的值大;若当前的和大于目标值target,即表示远离目标值,要缩小整体的范围,最右边的下标往左移动,直到当前位置的值比之前的小;若当前的和等于目标值,即为最优的结果,直接返回
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int minClosed = 10000000; //初始化的最小值
int result;
int sum;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i){
if (i > 0 && nums[i-1] == nums[i]) continue;
int j = i + 1;
int k = nums.size() - 1;
while (j < k){
sum = nums[i] + nums[j] + nums[k];
if (sum < target){
if (abs(sum - target) < minClosed){
minClosed = abs(sum - target);
result = sum;
}
while (j < k && nums[j] == nums[j+1]) j++; //往右移动
j++;
}
else if (sum > target){
if (abs(sum - target) < minClosed){
minClosed = abs(sum - target);
result = sum;
}
while (j < k && nums[k] == nums[k-1]) k--; //往左移动
k--;
}
else{
return target;
}
}
}
return result;
}
};