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;
    }
};

  

posted @ 2013-07-10 09:49  懒猫欣  阅读(205)  评论(0编辑  收藏  举报