一、题目
二、思路
和leetcode15三数之和类似,三层循环时间复杂度过高,使用双指针虽说不能马上降到
,但就是这类题的常用套路:
- 遍历一遍数组元素,当前元素为
num[i]
; - 设立左右指针,右指针为右端点,注意左指针为
left + 1
,而不是从0开始,否则会因为重复遍历而有重复元素;当三数之和大于target
则right
左移缩小值。 - 每次判断当前三数组合时,即计算和target之间的差值,如果比当前最小差值
minAbsError
还小,则可以进行更新。
三、代码
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = 0, left = 0, right = 0;
int minAbsError = INT_MAX, error = 0, absError = 0, temp = 0;
for(int i = 0; i < nums.size() - 2; i++){
left = i + 1;
right = nums.size() - 1;
while(left < right){
temp = nums[i] + nums[left] + nums[right];
error = temp - target;
absError = abs(error);
if(minAbsError > absError){
//更新过程
ans = temp;
minAbsError = absError;
}else if(error > 0){
right--;
}else{
left++;
}
}
}
return ans;
}
};