给定一个array,和一个target,要求求array中三个数之和与target最接近。保证唯一解。
直接暴力会超时。
可以排序,两层暴力,然后第三层用二分。就不会超时了。
int cmp(int a,int b) { return a < b; } class Solution { public: int bSearch(int tmp,int left,vector<int>&num,int right) { if(right - left <= 1) { if(abs(tmp - num[left]) < abs(tmp - num[right])) { return num[left]; } else { return num[right]; } } int mid = (left + right) / 2; if(num[mid] == tmp)return tmp; else if(num[mid] > tmp) { return bSearch(tmp,left,num,mid-1); } else { return bSearch(tmp,mid+1,num,right); } } int threeSumClosest(vector<int> &num, int target) { // Note: The Solution object is instantiated only once and is reused by each test case. int sum = 0; int dis = 0xffff; sort(num.begin(),num.end(),cmp); for(int i = 0;i < num.size()-2;i++) { for(int j = i+1;j < num.size()-1;j++) { int tmp = num[i] + num[j]; tmp += bSearch(target-tmp,j+1,num,num.size()-1); if(abs(tmp-target) < dis) { sum = tmp; dis = abs(tmp-target); } } } return sum; } };