解法一:三重循环遍历,加上少许优化,虽然运行效果尚可,但复杂度是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;
}
};