首页 » 编程之美 » 正文

[leetcode_15]3Sum

知道哥为啥后来坚持不下去了么!!!就是卡在3sum问题上了,才导致哥没办法 挑AC率高的题做。
因为3sum问题 也尼玛的老报错:OLE
3sum问题讲的是:
给定一个序列,让你找出3个数之和是0的那些数。开始天真的以为和2sum问题一样 简单的贪心,两个指针搞定问题。后来哎。
我的思路是:
先排序nlogn
然后 以此枚举2负1正,3个0,1负2正几种情况
n^2的复杂度,第三个用二分来找。
而且应该比严格意义上的n^2的复杂度要低。
最开始做这个题就担心超时。
结果它输出超时,恶心人。
修改代码后,一次AC:

</p>

<h1>include &amp;amp;lt;algorithm&amp;amp;gt;</h1>

<p>using namespace std;
int cmp(int a,int b)
{
    return a &amp;amp;lt; b;
}
class Solution {
public:
    vector&amp;amp;lt;vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt; threeSum(vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;amp;num) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        vector&amp;amp;lt;vector&amp;amp;lt;int&amp;amp;gt;&amp;amp;gt; ans;
        ans.clear();
        int <em>seq = new int[num.size()];
        for(int i = 0;i &amp;amp;lt; num.size();i++)
        {
            seq[i] = num[i];
        }
        sort(seq,seq+num.size(),cmp);
        int count0 = 0;
        int left = -1;
        int right = -1;
        for(int i = 0;i &amp;amp;lt; num.size();i++)
        {
            if(seq[i] == 0)
            {
                if(left == -1)
                {
                    left = i-1;
                }
                count0++;
            }
            if(seq[i] &amp;amp;gt; 0)
            {
                if(left == -1)
                {
                    left = i-1;
                }
                if(right == -1)
                {
                    right = i;
                    break;
                }
            }
        }
        int index = 0;
        if(left == -1 || right == -1)
        {
            if(count0 &amp;amp;gt;= 3)
            {
                vector&amp;amp;lt;int&amp;amp;gt; ivector(3,0);
                ans.push_back(ivector);
            }
            return ans;
        }
        //两负一正
        for(int i = 0;i &amp;amp;lt; left;i++)
        {
            for(int j = i+1;j &amp;amp;lt;= left;j++)
            {
                int a[3];
                a[0] = seq[i];
                a[1] = seq[j];
                a[2] = (seq[i] + seq[j])</em>(-1);
                if(bsearch(right,num.size()-1,seq,a[2]) == true)
                {
                    vector&amp;amp;lt;int&amp;amp;gt; ivector(a,a+3);
                    bool flag = false;
                    for(int k = 0;k &amp;amp;lt; ans.size();k++)
                    {
                        if(ivector == ans[k])
                        {
                            flag = true;
                            break;
                        }
                    }
                    if(flag == false)
                        ans.push_back(ivector);
                }<br />
            }
        }
        if(count0 &amp;amp;gt;= 1)
        {
            for(int i = 0;i &amp;amp;lt;= left;i++)
            {
                if(i &amp;amp;gt;= 1)
                {
                    if(seq[i] == seq[i-1])
                        continue;
                }
                int a[3];
                a[0] = seq[i];
                a[1] = 0;
                a[2] = seq[i]*(-1);
                if(bsearch(right,num.size()-1,seq,a[2]) == true)
                {
                    vector&amp;amp;lt;int&amp;amp;gt; ivector(a,a+3);</p>

<pre><code>                bool flag = false;
                for(int k = 0;k &amp;amp;amp;lt; ans.size();k++)
                {
                    if(ivector == ans[k])
                    {
                        flag = true;
                        break;
                    }
                }
                if(flag == false)
                    ans.push_back(ivector);
            }
        }
    }
    //三个零
    if(count0 &amp;amp;amp;gt;= 3)
    {
        vector&amp;amp;amp;lt;int&amp;amp;amp;gt; ivector(3,0);
        ans.push_back(ivector);
    }
    //一负两正
    for(int i = right;i &amp;amp;amp;lt; num.size() - 1;i++)
    {
        for(int j = i+1;j &amp;amp;amp;lt; num.size();j++)
        {
            if(i!=j)
            {
                int a[3];
                a[1] = seq[i];
                a[2] = seq[j];
                a[0] = (seq[i] + seq[j])*(-1);
                if(bsearch(0,left,seq,a[0]) == true)
                {
                    vector&amp;amp;amp;lt;int&amp;amp;amp;gt; ivector(a,a+3);
                    bool flag = false;
                    for(int k = 0;k &amp;amp;amp;lt; ans.size();k++)
                    {
                        if(ivector == ans[k])
                        {
                            flag = true;
                            break;
                        }
                    }
                    if(flag == false)
                        ans.push_back(ivector);
                }
            }
        }
    }       
    return ans;
}
bool bsearch(int left,int right,int *num,int a)
{
    if(left &amp;amp;amp;gt; right)
        return false;
    int mid = (left + right) / 2;
    if(num[mid] == a)return true;
    if(num[mid] &amp;amp;amp;gt; a)
    {
        return bsearch(left,mid - 1,num,a);
    }
    if(num[mid] &amp;amp;amp;lt; a)
    {
        return bsearch(mid+1,right,num,a);
    }
}
</code></pre>

<p>};

发表评论