一、题目
二、思路
和leetcode15三数之和类似,三层循环时间复杂度O ( n 3 ) O(n^3)O(n
3
)过高,使用双指针虽说不能马上降到O ( n ) O(n)O(n),但就是这类题的常用套路:
遍历一遍数组元素,当前元素为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; } };