0
点赞
收藏
分享

微信扫一扫

【LeetCode16】最接近的三数之和(双指针)


一、题目

【LeetCode16】最接近的三数之和(双指针)_i++

二、思路

和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;
}
};

【LeetCode16】最接近的三数之和(双指针)_数组_04


举报

相关推荐

0 条评论