LeetCode-3Sum Closest
3Sum Closest Jan 18 '12 3725 / 9704
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: void swap(vector<int> &num,int i,int j){ int temp=num[i]; num[i]=num[j]; num[j]=temp; } void bottomUp(vector<int> &num,int end){ while(end>0) { if(num[end]>num[end/2]){ swap(num,end,end/2); end/=2; } else break; } } void topDown(vector<int>&num,int end){ int index=0; while(true){ if(index*2>end){ break; } else if(index*2==end){ if(num[index]<num[index*2]){ swap(num,index,index*2); index*=2; } else break; } else{ int big=num[index]; int bigindex=index; if(num[index*2]>big){ big=num[index*2]; bigindex=index*2; } if(num[index*2+1]>big){ bigindex=index*2+1; } if(bigindex==index)break; else{ swap(num,index,bigindex); index=bigindex; } } } } void sort(vector<int>&num){ for(int i=0;i<num.size();i++){ bottomUp(num,i); } for(int i=num.size()-1;i>0;i--){ swap(num,0,i); topDown(num,i-1); } } int getIndexNearestSmall(vector<int>&num,int start,int end,int target){ if(start==end)return start; int mid=(start+end)/2; if(num[mid]>target) return getIndexNearestSmall(num,start,mid,target); else if(num[mid]==target) return mid; else return getIndexNearestSmall(num,mid+1,end,target); } int getIndexNearestSmall(vector<int>&num,int start,int target){ if(num[start]>target)return start; if(num[num.size()-1]<target)return num.size()-1; else return getIndexNearestSmall(num,start,num.size()-1,target); } int threeSumClosest(vector<int> &num, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(num); int buff=num[0]; if(buff<0){ for(int i=0;i<num.size();i++){ num[i]-=buff; } target-=3*buff; } else{ buff=0; } int sum=0; int min=2147483646; int best=0; for(int i=0;i<num.size()-2;i++){ for(int j=i+1;j<num.size()-1;j++){ //cout<<i<<" "<<j<<endl; int k=getIndexNearestSmall(num,j+1,target-num[i]-num[j]); sum=num[i]+num[j]+num[k]; if((sum-target)*(sum-target)<min) { min=(sum-target)*(sum-target); best=sum; } if(k<num.size()-1){ sum=num[i]+num[j]+num[k+1]; if((sum-target)*(sum-target)<min) { min=(sum-target)*(sum-target); best=sum; } } } } best+=3*buff; return best; } };