leetcode-15 3Sum

来源:互联网 发布:软件管理下载安装 编辑:程序博客网 时间:2024/06/10 05:56

a+b+c=0可以看做a+b=-c。利用twoSum的方法。

class Solution {public://想法是,首先采用快排进行排序,//然后利用twoSum的方法,将-c当做target即可。    void quick_sort( vector<int> &s, int left, int right)//快排,首先排序    {        if(left < right)        {            swap(s[left], s[(left + right)/2]);//将第一个数与中间的数交换,尽量取得中位数            int i= left, j= right;            vector<int> x{ s[i] };            while( i < j)            {                while( x[0] <= s[j] && i < j)// 找到最右边第一个小于X的数                    --j;                if( i < j)                s[i++] = s[j];                while( x[0] > s[i] && i < j)//找到最左边第一个大于X的数                    ++i;                if(i < j)                s[j--] = s[i];            }            s[i] = x[0];            quick_sort(  s,  left,  i-1); //递归调用快排,排前半段            quick_sort(  s,  i+1,  right); //递归调用快排,排后半段        }    }    //twoSum()    void twoSum( vector<int> &temp, vector<vector<int> > &solu, int targetDex)    {        int i= targetDex + 1, j = temp.size()-1;        //vector<int> v;        while( i < j)        {            if(temp[targetDex] + temp[i] + temp[j] > 0)            --j;            else if(temp[targetDex] + temp[i] + temp[j] < 0)            ++i;            else            {                vector<int> v;                v.push_back(temp[targetDex]);                v.push_back(temp[i]);                v.push_back(temp[j]);                solu.push_back(v);                ++i;                --j;                while(i < temp.size() && temp[i]==temp[i - 1]) i++;                    while(j >= 0 && temp[j] == temp[j + 1]) j--;             }        }    }    vector<vector<int> > threeSum(vector<int> &num) {        vector<vector<int> > solution;        int countS=0;        int left = 0, right = num.size() - 1;        quick_sort( num , left, right);//快排        //利用two sum 的办法,将a+b+c = 0 看做 a+b = -c,        for(int i=0; i < num.size(); ++i)        {            if( i > 0 && num[i] == num[i-1] || num[i] > 0)            continue;            twoSum( num, solution, i);        }        return solution;    }};
0 0