您的位置:首页 > 其它

【leetcode】18. 4Sum

2016-05-23 16:49 232 查看
/**
* Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target?
* Find all unique quadruplets in the array which gives the sum of target.

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

using namespace std;

vector<vector<int>> findNum(vector<int>& nums, int begin, int count, int target)
{
vector<vector<int>> rs;
set<int> visited;

int len = nums.size();

if (count == 2)
{
int l = begin, r = len - 1;
vector<int> tmp;
int sum = 0;

while (l < r)
{
sum = nums[l] + nums[r];
if (sum == target && visited.find(nums[l]) == visited.end())
{
tmp.clear();
tmp.push_back(nums[l]);
tmp.push_back(nums[r]);

visited.insert(nums[l]);
visited.insert(nums[r]);

rs.push_back(tmp);
l++;
r--;
}
else if (sum < target)
l++;
else
r--;
}
}
else
{
vector<vector<int>> sub;
for (int i = begin; i < len; i++)
{
if (visited.find(nums[i]) == visited.end())
{
visited.insert(nums[i]);
sub = findNum(nums, i + 1, count - 1, target - nums[i]);
if (!sub.empty())
{
for (int j = 0; j < sub.size(); j++)
{
sub[j].push_back(nums[i]);
rs.push_back(sub[j]);
}
}
sub.clear();
}
}
}
return rs;
}

vector<vector<int>> threeSum1(vector<int>& nums, int target)
{
sort(nums.begin(), nums.end());
return findNum(nums, 0, 3, target);
}

vector<vector<int>> fourSum(vector<int>& nums, int target)
{
sort(nums.begin(), nums.end());
return findNum(nums, 0, 4, target);
}

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

vector<vector<int>> rs = fourSum(nums, 0);

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;
}


相关文档

2Sum

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