【leetcode】18. 4Sum

来源:互联网 发布:人像素描书 知乎 编辑:程序博客网 时间:2024/05/16 13:54
/** * 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

0 0
原创粉丝点击