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).
先排序,遍历第一个指针,后两个指针从剩余的数两头往中间走
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { int size = nums.size(); if(size == 0) return 0; else if(size == 1) return nums[0]; else if( size == 2) return nums[0] + nums[1]; //排序 int *number = new int[size]; for( int i = 0; i < size; i++) number[i] = nums[i]; QuickSort(number, size); //求和 int mid,right = size - 1,dif = INT_MAX,sum,result = 0; for( int i = 0;i < size - 2; i++) { if( i != 0 && number[i] == number[i-1]) continue; mid = i + 1; right = size - 1; while(mid < right) { if( number[mid] == number[mid -1] && mid > i+1) { mid ++; continue; } sum = number[i] + number[mid] + number[right]; if( target == sum ) return target; else if(target < sum) { if( dif > sum - target) { dif = sum - target; result = sum; } right --; } else { if( dif > target - sum) { dif = target - sum; result = sum; } mid ++; } } } delete []number; return result; } //从小到大排序 void QuickSort(int *num, int size) { if( size <= 1) return; int mid = num[size - 1],tmp, i = 0,j = 0; for(; i < size - 1; i ++) { if( num[i] < mid) { tmp = num[i]; num[i] = num[j]; num[j] = tmp; j++; } } num[size - 1] = num[j]; num[j] = mid; if(j > 1) QuickSort(num, j ); if(j < size - 2) QuickSort(num + j + 1, size - j - 1); } };