class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int ClosestSum(vector<int>& nums, int target) { // write code here // 排序加二分,枚举二分左边界作为第一个数,然后在左右边界里找其他两个数 // 就从左边界和右边界出发,如果三个数加起来正好是目标值,直接返回 // 如果三个数加起来更大,调整右边界往左走 // 如果三个数加起来更小,调整左边界往右走 // 同时比较更新最接近的三数之和 sort(nums.begin(), nums.end()); int n = nums.size(); int closestSum = nums[0] + nums[1] + nums[2]; for (int i = 0; i < n - 2; ++i) { int left = i + 1, right = n - 1; while (left < right) { int currentSum = nums[i] + nums[left] + nums[right]; if (currentSum == target) { return currentSum; } // 更新最接近的三数之和 if (abs(currentSum - target) < abs(closestSum - target)) { closestSum = currentSum; } if (currentSum < target) { left++; } else { right--; } } } return closestSum; } };