4Sum

来源:互联网 发布:上海心动网络怎么样 编辑:程序博客网 时间:2024/06/05 18:10
struct Node{int val;int num1;int num2;};bool cmp(const Node& n1,const Node& n2){    if(n1.val!=n2.val)    {        return n1.val<n2.val;    }    if(n1.num1!=n2.num1)    {        return n1.num1<n2.num1;    }    return n1.num2<n2.num2;}class Solution {private:    int lowerBound(int start,int end,int target,const vector<Node>& nodes)    {        while(start<end)        {            int mid=start+(end-start)/2;            if(nodes[mid].val>=target)            {                end=mid;            }            else            {                start=mid+1;            }        }        return start;    }    int upperBound(int start,int end,int target,const vector<Node>& nodes)    {        while(start<end)        {            int mid=start+(end-start)/2;            if(nodes[mid].val>target)            {                end=mid;            }            else            {                start=mid+1;            }        }        return start;    }    bool isValid(int i1,int i2,int j1,int j2)    {        if(i1==j1)        {            return false;        }        if(i1==j2)        {            return false;        }        if(i2==j1)        {            return false;        }        if(i2==j2)        {            return false;        }        return true;    }    vector<Node> nodes;public:    vector<vector<int> > fourSum(vector<int> &num, int target) {        for(int i=0;i<num.size();++i)        {            for(int j=i+1;j<num.size();++j)            {                Node node;                node.val=num[i]+num[j];                node.num1=i;                node.num2=j;                nodes.push_back(node);            }        }        sort(nodes.begin(),nodes.end(),cmp);        set<vector<int> > res;        for(int i=0;i<((int)nodes.size()-1);++i)        {            int lower=lowerBound(i+1,nodes.size(),target-nodes[i].val,nodes);            int upper=upperBound(i+1,nodes.size(),target-nodes[i].val,nodes);            if((lower!=-1)&&(upper!=-1))            {                for(int j=lower;j<upper;++j)                {                    if(isValid(nodes[i].num1,nodes[i].num2,nodes[j].num1,nodes[j].num2))                    {                        vector<int> tmp;                        tmp.push_back(num[nodes[i].num1]);                        tmp.push_back(num[nodes[i].num2]);                        tmp.push_back(num[nodes[j].num1]);                        tmp.push_back(num[nodes[j].num2]);                        sort(tmp.begin(),tmp.end());                        res.insert(tmp);                    }                }            }        }        return vector<vector<int> >(res.begin(),res.end());    }};

0 0