针对三数之和,我将原来的nums数组分为正负两个数组,通过两层for循环,得到所有和为零的三元数组
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ans;
vector<int>positive, negative, temp;
int sum = 0;
auto zero = find(nums.begin(), nums.end(), 0);
if (nums.size() < 3)
{
return ans;
}
for (auto i = nums.begin(); i != nums.end(); i++)
{
if (*i == 0)
{
sum++;
}
if (sum == 3)
{
temp = { 0,0,0 };
if (find(ans.begin(), ans.end(), temp) == ans.end())
{
if (temp.size() == 3)
{
ans.push_back(temp);
}
}
sum = 0;
}
(*i > 0) ? positive.push_back(*i) : negative.push_back(*i);
}
sort(positive.begin(), positive.end());
sort(negative.begin(), negative.end());
for (auto i = negative.begin(); i != negative.end(); i++)
{
for (auto j = positive.begin(); j != positive.end(); j++)
{
sum = 0;
sum -= (*i + *j);
if (sum == 0 && zero != nums.end())
{
temp = { *i,0,*j };
}
else
{
if (sum > 0)
{
auto third = find(j + 1, positive.end(), sum);
if (third != positive.end())
{
temp = { *i,*j,*third };
sort(temp.begin(), temp.end());
}
}
else
{
auto third = find(i + 1, negative.end(), sum);
if (third != negative.end())
{
temp = { *i,*j,*third };
sort(temp.begin(), temp.end());
}
}
}
if (find(ans.begin(), ans.end(), temp) == ans.end())
{
if (temp.size() == 3)
{
ans.push_back(temp);
}
}
}
}
return ans;
}
};