3Sum Closest
Jan 18 '12
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).
算法:可以采用和3Sum问题相似的算法,对数组排序后枚举v[i],取1-v[i]作为target,进行类似2Sum的计算,返回与target差值最小的差值。算法复杂度也是O(N^2)的。
程序:
int threeSumClosest(vector<int> &num, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort(num.begin(),num.end());
int target2sum;
int minum_difference;
int flag=0;
vector<int>::iterator it = num.begin();
for(;it!=num.end()-1;){
target2sum = target-*it;;
if(it==num.begin()) flag = 1;
//erase the element
it = num.erase(it);
//2Sum2
if(flag){
minum_difference = twoSumCloset(num,target2sum);
flag = 0;
}else{
int ret2 = twoSumCloset(num,target2sum);
minum_difference = abs(minum_difference)<abs(ret2)?minum_difference:ret2;
}
num.insert(it,target-target2sum);
it++;
}
return minum_difference+target;
}
int twoSumCloset(vector<int> &num,int target){
int i = 0;
int j = num.size()-1;
int difference = num[i]+num[j]-target;
int ret = difference;
while(i<j){
difference = num[i]+num[j]-target;
if(abs(difference)<abs(ret)) ret = difference;
if(difference > 0){
j--;
}else if(difference<0){
i++;
}else{
break;
}
}
return ret;
}
时间:112 milli secs