Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
分析:最简单的方法当然就是暴力解法,三重循环,时间复杂度太高,不能通过。
优化后的算法:先排序,时间复杂度是O(n*logn),然后对排序后的向量按照跟3Sum相近的方法求解。枚举a,b=a+1,c=max-1,a+b+c=target,则找到解;a+b+c<target,则b++;a+b+c>target,则c--class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int min_closet = 0x7fffffff; int res; int tem_dis; int sum = 0; int i,j,k; int n = nums.size(); for( i = 0;i < n-2 ;i++) { j = i + 1; k = n - 1; while(j < k) { sum = nums[i] + nums[j] + nums[k]; tem_dis = abs(target - sum); //min_closet = min_closet >tem_dis ? tem_dis:min_closet; if(sum == target) return sum; else if(target > sum) { j++; if(tem_dis < min_closet) { min_closet = tem_dis; res = sum; } } else { k--; if(tem_dis < min_closet) { min_closet = tem_dis; res = sum; } } } } return res; } };