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).
方法1: 排序+二分法查找 算法复杂度O(n2log(n))
class Solution { private: int find_first_large(int left, int right, int val,vector<int>& nums){ while(left < right){ int middle = left + (right - left)/2; if(nums[middle] < val) left = middle + 1; else if(nums[middle] > val) right = middle; else return middle; } return left; } public: int threeSumClosest(vector<int>& nums, int target) { int MAX_difference = INT_MAX; int res; sort(nums.begin(),nums.end()); if(nums.size() < 3) return 0; for(int i = 0 ; i < nums.size() - 2; ++i){ if(i!=0 && nums[i]==nums[i-1]) continue; for(int j = i + 1; j < nums.size() - 1; ++j){ if(j!=i+1 && nums[j] == nums[j-1]) continue; int val = target - nums[i] - nums[j]; int val_index = find_first_large(j+1,nums.size()-1,val,nums); int temp_target = nums[i] + nums[j] + nums[val_index]; int difference = abs(temp_target - target); if(val_index != 0 && val_index !=j+1 ){ if( abs(nums[i] + nums[j] + nums[val_index-1] - target) < difference){ difference = abs(nums[i] + nums[j] + nums[val_index-1] - target); temp_target = nums[i] + nums[j] + nums[val_index-1]; } } if(difference < MAX_difference){ MAX_difference = difference; res = temp_target; } } } return res; } };方法2:利用三个指针,算法复杂度 (O2)。
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int max_dif = INT_MAX; int res ; for(int first = 0 ; first < nums.size()-2 ; ++first){ int second = first + 1, third = nums.size() - 1; while(second < third){ int temp_target = nums[first] + nums[second] + nums[third]; if(abs(temp_target-target) < max_dif){ max_dif = abs(temp_target-target); res = temp_target; } if( temp_target> target ) --third; else if(temp_target < target) ++second; else return target; } } return res; } };