LeetCode-3Sum

来源:互联网 发布:雨花区软件谷 编辑:程序博客网 时间:2024/06/10 08:02

解法一:三重循环遍历,加上少许优化,虽然运行效果尚可,但复杂度是O(n^3),偏高

class Solution {public:    vector<vector<int> > threeSum(vector<int> &num) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<vector<int> > vec;        sort(num.begin(), num.end());        //第一个非负数的位置,用于循环条件优化        vector<int>::size_type posZero = num.size();        for (vector<int>::size_type i = 0; i < num.size(); ++i)        {            if (num[i] >= 0)            {                posZero = i;                break;            }        }        if (posZero == num.size())        {            return vec;        }        for (vector<int>::size_type i = 0; i < num.size() - 2; ++i)        {            //第一个数就是正数,则一定不是解            if (num[i] > 0)            {                break;            }            //第一个数与前一个数相同,属于重复情况,跳过            if (i > 0 && num[i] == num[i - 1])            {                continue;            }            for (vector<int>::size_type j = i + 1; j < num.size() - 1; ++j)            {                //前两个数之和大于0,不是解                if (num[i] + num[j] > 0)                {                    break;                }                vector<int>::size_type k = max(j + 1, posZero);                for (; k < num.size(); ++k)                {                    int sum3 = num[i] + num[j] + num[k];                    if (sum3 == 0)                    {                        vector<int> vec1;                        vec1.push_back(num[i]);                        vec1.push_back(num[j]);                        vec1.push_back(num[k]);                        if (vec.size() != 0)                        {                            //检验是否是重复解                            vector<int> last = vec[vec.size() - 1];                            if (vec1 != last)                            {                                vec.push_back(vec1);                            }                        }                        else                        {                            vec.push_back(vec1);                        }                    }                    else if (sum3 > 0)                    {                        break;                    }                }            }        }        return vec;    }};

 

解法二:只须二重循环,外层循环选定一个数,内层循环同时指定两个数进行试探,复杂度为O(n^3)

class Solution {public:    vector<vector<int> > threeSum(vector<int> &num) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<vector<int> > vec;        if (num.size() < 3)            return vec;        sort(num.begin(), num.end());        for (vector<int>::size_type i = 0; i < num.size() - 2; ++i)        {            if (num[i] > 0)                break;            int j = i + 1, k = num.size() - 1;            while (j < k)            {                if (num[i] + num[j] > 0)                    break;                if (num[j] + num[k] < -num[i])                    ++j;                else if (num[j] + num[k] > -num[i])                    --k;                else                {                    vector<int> vec1;                    vec1.push_back(num[i]);                    vec1.push_back(num[j]);                    vec1.push_back(num[k]);                    vec.push_back(vec1);                    //去重                    while (j < k && num[j] == num[j + 1])                        ++j;                    while (k > j && num[k] == num[k - 1])                        --k;                    ++j;                    --k;                }            }            //去重            while (i < num.size() - 2 && num[i + 1] == num[i])                ++i;        }        return vec;    }};

原创粉丝点击