4.30更新,已经AC
18. 4Sum My Submissions QuestionEditorial Solution
Total Accepted: 71102 Total Submissions: 299393 Difficulty: Medium
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)
结果:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int> > result;
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=0;i<n-1;++i){
for(int j=i+1;j<n;++j){
int front = nums[i]+nums[j];
int beg = j+1,end = n-1;
while(beg<end){
int tsum = front + nums[beg]+nums[end];
if(tsum==target){
vector<int> vec;
vec.push_back(nums[i]),vec.push_back(nums[j]);
vec.push_back(nums[beg]),vec.push_back(nums[end]);
result.push_back(vec);
while(++beg<end&&nums[beg-1]==nums[beg]);
while(--end>beg&&nums[end+1]==nums[end]);
}
else {
if(tsum<target)beg++;
else end--;
}
}
}
}
sort(result.begin(),result.end());
result.erase(unique(result.begin(),result.end()),result.end());
return result;
}
};
思路:先保存两个整数的和,然后两层循环搞定
平均时间复杂度: O(n2)
还是time limit,期待更好的解法。。。。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int> > result;
if(nums.size()<4)return result;
sort(nums.begin(),nums.end());
map<int,vector<pair<int,int> > > cache;
for(size_t a=0;a<nums.size();++a){
for(size_t b=0;b<nums.size();++b){
cache[nums[a]+nums[b]].push_back(pair<int,int>(a,b));
}
}
for(int c=0;c<nums.size();++c){
for(size_t d=c+1;d<nums.size();++d){
const int key = target -nums[c]-nums[d];
if(cache.find(key)==cache.end())continue;
const auto&vec =cache[key];
for(size_t k=0;k<vec.size();++k){
if(c<=vec[k].second)continue;
result.push_back({
nums[vec[k].first],nums[vec[k].second],nums[c],nums[d]});
}
}
}
sort(result.begin(),result.end());
result.erase(unique(result.begin(),result.end()),result.end());
return result;
}
};
testcase:
[91277418,66271374,38763793,4092006,11415077,60468277,1122637,72398035,−62267800,22082642,60359529,−16540633,92671879,−64462734,−55855043,−40899846,88007957,−57387813,−49552230,−96789394,18318594,−3246760,−44346548,−21370279,42493875,25185969,83216261,−70078020,−53687927,−76072023,−65863359,−61708176,−29175835,85675811,−80575807,−92211746,44755622,−23368379,23619674,−749263,−40707953,−68966953,72694581,−52328726,−78618474,40958224,−2921736,−55902268,−74278762,63342010,29076029,58781716,56045007,−67966567,−79405127,−45778231,−47167435,1586413,−58822903,−51277270,87348634,−86955956,−47418266,74884315,−36952674,−29067969,−98812826,−44893101,−22516153,−34522513,34091871,−79583480,47562301,6154068,87601405,−48859327,−2183204,17736781,31189878,−23814871,−35880166,39204002,93248899,−42067196,−49473145,−75235452,−61923200,64824322,−88505198,20903451,−80926102,56089387,−58094433,37743524,−71480010,−14975982,19473982,47085913,−90793462,−33520678,70775566,−76347995,−16091435,94700640,17183454,85735982,90399615,−86251609,−68167910,−95327478,90586275,−99524469,16999817,27815883,−88279865,53092631,75125438,44270568,−23129316,−846252,−59608044,90938699,80923976,3534451,6218186,41256179,−9165388,−11897463,92423776,−38991231,−6082654,92275443,74040861,77457712,−80549965,−42515693,69918944,−95198414,15677446,−52451179,−50111167,−23732840,39520751,−90474508,−27860023,65164540,26582346,−20183515,99018741,−2826130,−28461563,−24759460,−83828963,−1739800,71207113,26434787,52931083,−33111208,38314304,−29429107,−5567826,−5149750,9582750,85289753,75490866,−93202942,−85974081,7365682,−42953023,21825824,68329208,−87994788,3460985,18744871,−49724457,−12982362,−47800372,39958829,−95981751,−71017359,−18397211,27941418,−34699076,74174334,96928957,44328607,49293516,−39034828,5945763,−47046163,10986423,63478877,30677010,−21202664,−86235407,3164123,8956697,−9003909,−18929014,−73824245]−236727523