/*
* Leetcode16. 3Sum Closest
* Funtion: 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.
* Example:
Input: given array S = {-1 2 1 -4}, and target = 1.
Output: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Input:[1,1,1,0]100Expected:3
* Author: LKJ
* Date:2016/7/29
* Hint:related to 15.3Sum
*/
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
class Solution {
private:
int myabs(int num){
if(num < 0) num = -num;
return num;
}
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int len = nums.size();
int leftnum;
int rightnum;
int sum;
int diff;
int temp = 2147483647;
int ans;
for(int i = 0; i < len-2; i++){
leftnum = i+1;
rightnum = len-1;
while(leftnum < rightnum){
sum = nums[i] + nums[leftnum] + nums[rightnum];
diff = myabs(sum - target);
if(diff < temp){
temp = diff;
ans = sum;
}
if(sum > target){
rightnum--;
}else{
leftnum++;
}
}
}
return ans;
}
};
int main(){
int myarr[4] = {1,1,1,0};
vector<int> myin1(myarr,myarr+4);
int myin;
int myout;
Solution SA;
cout << "Please Enter" << endl;
cin >> myin;
myout = SA.threeSumClosest(myin1,myin);
cout << myout << endl;
// cout<<"VecOUT:"<<myout.size()<<endl;
// for(unsigned int i = 0; i < myout.size(); i++){
// for(vector<int>::iterator itt = myout[i].begin() ;itt!=myout[i].end();itt++){
// cout<<*itt<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
//cout<<"VecOUT:"<<endl;
//for(vector<int>::iterator it = myout.begin() ;it!=myout.end();it++){
// cout<<*it<<" ";
//}
cout<<endl;
return 0;
}