知道哥为啥后来坚持不下去了么!!!就是卡在3sum问题上了,才导致哥没办法 挑AC率高的题做。
因为3sum问题 也尼玛的老报错:OLE
3sum问题讲的是:
给定一个序列,让你找出3个数之和是0的那些数。开始天真的以为和2sum问题一样 简单的贪心,两个指针搞定问题。后来哎。
我的思路是:
先排序nlogn
然后 以此枚举2负1正,3个0,1负2正几种情况
n^2的复杂度,第三个用二分来找。
而且应该比严格意义上的n^2的复杂度要低。
最开始做这个题就担心超时。
结果它输出超时,恶心人。
修改代码后,一次AC:
</p> <h1>include &amp;lt;algorithm&amp;gt;</h1> <p>using namespace std; int cmp(int a,int b) { return a &amp;lt; b; } class Solution { public: vector&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt; threeSum(vector&amp;lt;int&amp;gt; &amp;amp;num) { // Note: The Solution object is instantiated only once and is reused by each test case. vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; ans; ans.clear(); int <em>seq = new int[num.size()]; for(int i = 0;i &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;lt; num.size();i++) { if(seq[i] == 0) { if(left == -1) { left = i-1; } count0++; } if(seq[i] &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;gt;= 3) { vector&amp;lt;int&amp;gt; ivector(3,0); ans.push_back(ivector); } return ans; } //两负一正 for(int i = 0;i &amp;lt; left;i++) { for(int j = i+1;j &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;lt;int&amp;gt; ivector(a,a+3); bool flag = false; for(int k = 0;k &amp;lt; ans.size();k++) { if(ivector == ans[k]) { flag = true; break; } } if(flag == false) ans.push_back(ivector); }<br /> } } if(count0 &amp;gt;= 1) { for(int i = 0;i &amp;lt;= left;i++) { if(i &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;lt;int&amp;gt; ivector(a,a+3);</p> <pre><code> 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); } } } //三个零 if(count0 &amp;amp;gt;= 3) { vector&amp;amp;lt;int&amp;amp;gt; ivector(3,0); ans.push_back(ivector); } //一负两正 for(int i = right;i &amp;amp;lt; num.size() - 1;i++) { for(int j = i+1;j &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;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); } } } } return ans; } bool bsearch(int left,int right,int *num,int a) { if(left &amp;amp;gt; right) return false; int mid = (left + right) / 2; if(num[mid] == a)return true; if(num[mid] &amp;amp;gt; a) { return bsearch(left,mid - 1,num,a); } if(num[mid] &amp;amp;lt; a) { return bsearch(mid+1,right,num,a); } } </code></pre> <p>};