LeetCode-3 Sum

3SumJan 18 '12    6170 / 23359

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ? b ? c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

沿用了3 Sum closest的代码

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

    vector<vector<int> > threeSum(vector<int> &num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<int>> result;
        if(num.size()<3)return result;
        int target=0;
        sort(num);
        int sum=0;
        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){
                    vector<int> ret;
                    ret.push_back(num[i]);
                    ret.push_back(num[j]);
                    ret.push_back(num[k]);

                    bool flag=true;
                    for(int ii=0;ii<result.size();ii++){
                        if(result[ii][0]==ret[0]&&result[ii][1]==ret[1]&&result[ii][2]==ret[2])
                        {flag=false;break;}
                    }
                    if(flag)
                    result.push_back(ret);
               }             
            }
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/superzrx/p/3182889.html