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;
}
};
浙公网安备 33010602011771号