最接近的三数之和
题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
double minDif = INT_MAX; // 最小差值
double answer = 0;
sort(nums.begin(),nums.end());
for(int i = 0 ; i<nums.size()-2 ; i++){
int left = i+1,right = nums.size() - 1; // 定义双指针
while(left < right){
// 难点:移动规则
double tempDif = nums[left] + nums[right] + nums[i] - target;
if(minDif > abs(tempDif)){
minDif = abs(tempDif); // 更新最小距离
answer = nums[left] + nums[right] + nums[i];
}
if(tempDif < 0){
left ++;
}else if(tempDif > 0){
right --;
}else{
return answer;
}
}
}
return answer;
}
};
运用双指针以及排序的方法(思路和这篇文章类似),这里主要的难点就是指针移动规则的制定,而这个规则:当三个数之和大于目标值时,则应该将右指针向左移动;当三个数之和小于目标值时,应该将左指针向右边移动;当三个数之和等于目标值时,直接返回保存的结果。