题目简介:
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
1 2 3
| 输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
|
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
思路:
这题与15. 三数之和有相似之处,可以采取相同的双指针方法。
首先依然是先排序,然后循环数字,如果碰到与前一个相同的数字,则continue
,防止重复判断。
然后每次定义left = i + 1, right = nums.size() - 1
,比较sum
与target
的大小,其中sum = nums[i] + nums[left] + nums[right]
。若sum < target
,则left
向后移动到不重复的第一个数字(防止重复判断);若sum > target
,则right
向前移动到不重复的第一个数字;若sum == target
,则直接返回target
即可(相差为0)。
在循环过程中保存与target
差值最小的sum
,最后返回即可。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Solution { public: int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end()); int Min_Sum = INT_MAX; int nearest = INT_MAX;
for(int i = 0; i < nums.size(); i++){
if(i > 0 && nums[i] == nums[i - 1]) continue; int left = i + 1; int right = nums.size() - 1; while(left < right){
int sum = nums[i] + nums[left] + nums[right]; if(abs(sum - target) < nearest){
Min_Sum = sum; nearest = abs(sum - target); } if(sum < target){
while(left < right && nums[left] == nums[left + 1]) left++;
left++; } else if(sum > target){
while(left < right && nums[right] == nums[right - 1]) right--;
right--; } else return target; } }
return Min_Sum;
} };
|