您的位置:首页 > 其它

【leetcode】15. 3Sum

2016-05-20 17:49 453 查看
/**
* Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

* Note:
* Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
* The solution set must not contain duplicate triplets.
*   For example, given array S = {-1 0 1 2 -1 -4},
*
*   A solution set is:
*   (-1, 0, 1)
*   (-1, -1, 2)
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

//利用之前的twosum,改写一下
vector<vector<int>> twoSum2(vector<int>& nums, int target, int index)
{
vector<vector<int>> rs;
vector<int> r(2, 0);
int s = 0;
int e = nums.size() - 1;
for (int i = index; i < e;)
{
s = (nums[i] + nums[e]);
if (s == target)
{
r[0] = nums[i];
r[1] = nums[e];
rs.push_back(r);
i++;
e--;
}
else if (s < target)
i++;
else
e--;
}
return rs;
}

vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> rs;
int len = nums.size();

if (len < 3)
return rs;

vector<vector<int>> tmp;
for (int i = 0; i < len - 2; i++)
{
if (nums[i] == nums[i + 1]) continue;

tmp = twoSum2(nums, 0 - nums[i], i);
if (!tmp.empty())
{
for (int j = 0; j < tmp.size(); j++)
{
tmp[j].push_back(nums[i]);
rs.push_back(tmp[j]);
}
tmp.clear();
}
}
return rs;
}

int main()
{
vector<int> nums = {-1, 0, 1, 2, -1, -4};

sort(nums.begin(), nums.end());

vector<vector<int>> rs;
rs = threeSum(nums);

for (int i = 0; i < rs.size(); i++)
{
for (int j = 0; j < rs[i].size(); j++)
{
cout << rs[i][j] << "    ";
}
cout << endl;
}

system("pause");
return 0;
}


相关文档

twoSum
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: