题目描述
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路:所有N数之和
的问题,都应该想到排序
+双指针
。
当N > 2
时,外层用循环嵌套处理。例如:N = 3
则一层循环 + 双指针;N = 4
则两层循环 + 双指针。
本题思路:先快速排序,再用双指针找三数之和。(在数组 nums
中,进行遍历,前指针指向 start = i + 1
处,后指针指向 end = nums.length - 1
处,则该问题变成了“两数之和”问题)
参考代码
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int length = nums.size();
if(length < 3)
return 0;
sort(nums.begin(), nums.end());
int res = 0;
int min_gap = INT_MAX;
for(int i = 0; i <= length-3; i++){
int low = i + 1, high = length - 1;
while(low < high){
int tmp_sum = nums[i] + nums [low] + nums[high];
int tmp_gap = abs(target - tmp_sum);
if(tmp_gap == 0)
return tmp_sum;
if(tmp_gap < min_gap){
min_gap = tmp_gap;
res = tmp_sum;
}
if(tmp_sum > target)
high--;
else
low++;
}
}
return res;
}
};