
题目:
给定一个数组,找出其中和为0的所有3个数的组合。每个组合的3个数都是非递降的。
解法:
先排序再遍历,设置3个指针,第一个依次遍历,第二三个在第一个指针后面的部分里,左右夹逼查找和为第一个数的相反数的组合。时间O(N2)。
代码:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > result;
if(num.size() < )
return result; sort(num.begin(), num.end()); //排序 for(int a = ; a < num.size() - ; ++a) //a指向第一个数
{
if(num[a] > ) //如果第一个数>0
break; if(a > && num[a] == num[a-]) //如果和上一个重复,则前进一个
continue; for(int b = a + , c = num.size() - ; b < c; ) //b、c分别指向第二个数和第三个数,左右夹逼
{
if(b > a + && num[b] == num[b-]) //和上一个重复,则前进1
{
++b;
continue;
}
if(c < num.size() - && num[c] == num[c+]) //同上
{
--c;
continue;
} int sum = num[a] + num[b] + num[c];
if(sum == )
{
result.push_back({num[a], num[b], num[c]});
++b;
--c;
}
else if(sum > ) --c;
else
++b;
}
} return result;
}
};