如题所述,出一个数组,求其中的三个数的和为给定的target的值
target: 0
eg:给出数组{-1 3 -2 0 1 2 -5 4 }
结果为:-5 1 4
-5 2 3
-2 -1 3
-2 0 2
-1 0 1
思路:将数组排序之后,左右夹逼。
#include<iostream>
#include<vector>
#include<iterator>
//#include<map>
#include<algorithm>
using namespace std;
int main()
{
vector<int> nums;
int target;
cin >> target;
int value;
while(cin >> value)
nums.push_back(value);
vector<int> result;
if (nums.size() < 3) return 0;
sort(nums.begin(), nums.end());
vector<int>::iterator last = nums.end();
for (vector<int>::iterator i = nums.begin(); i < last-2; ++i)
{
vector<int>::iterator j = i+1;
if (i > nums.begin() && *i == *(i-1)) continue;
vector<int>::iterator k = last-1;
while (j < k)
{
if (*i + *j + *k < target)
{
++j;
while(*j == *(j - 1) && j < k) ++j;
}
else if (*i + *j + *k > target)
{
--k;
while(*k == *(k + 1) && j < k) --k;
}
else
{
result.push_back(*i);
result.push_back(*j);
result.push_back(*k);
++j;
--k;
while(*j == *(j - 1) && *k == *(k + 1) && j < k) ++j;
}
}
}
int n = 0;
for (int i = 0; i < result.size(); i++)
{
cout << result[i] << " ";
n++;
if ( n%3 == 0)
cout << endl;
}
return 0;
}