LeetCode之18_4Sum

来源:互联网 发布:手机安全中心软件 编辑:程序博客网 时间:2024/06/05 21:58

题目原文:

Given an array S of n integers, are there elements abc, 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: 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]]



题意分析:

与前面的3sum类似,唯一的差别是这次变成了四个数字的组合,解题思路与16_3Sum Closest相似,这次用target减去两个选出的数作为目标。

若加入分支限界等思路可的得到更好的效率。


解题代码:

#include <iostream>#include <vector>#include <set>#include<algorithm>using namespace std;class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {//返回所有可能的组合的容器set<vector<int>> vv_Ret;vector<vector<int>> Ret;int nLen = nums.size();if (nLen<4){return Ret;}sort(nums.begin(),nums.end());for (int a = 0; a<nLen-3;a++){for (int b = a+1; b<nLen-2;b++){int nTempTarget = target-nums[a]-nums[b];int c = b+1;int d = nLen-1;while (c<d){int nNowSum =  nTempTarget-nums[c]-nums[d];if (nNowSum < 0){d--;continue;}else if (nNowSum > 0){c++;continue;}else if (nNowSum == 0){vector<int> vTemp;vTemp.push_back(nums[a]);vTemp.push_back(nums[b]);vTemp.push_back(nums[c]);vTemp.push_back(nums[d]);vv_Ret.insert(vTemp);c++;}}}}/*vector<vector<int>>::iterator iter;iter = unique(vv_Ret.begin(),vv_Ret.end());if(iter != vv_Ret.end()){vv_Ret.erase(iter,vv_Ret.end());}*/for (set<vector<int>>::iterator ite = vv_Ret.begin(); ite!= vv_Ret.end();ite++){Ret.push_back(*ite);}return Ret;}};



0 0