4Sum
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)
思路:
4sum 转换为 3sum,而后转换为2sum。
2sum算法复杂度为O(nlgn),为排序复杂度。
3sum算法复杂度为O(N^2)
4sum算法复杂度为O(N^3).
注意事项: 去重。
1 class Solution { 2 public: 3 vector<vector<int> > fourSum(vector<int> &num, int target) { 4 sort(num.begin(),num.end()); 5 vector<vector<int>> res; 6 for(int i=num.size()-1;i>0;i--) 7 { 8 if(i==num.size()-1||num[i]!=num[i+1])//avoid duplicated items. 9 { 10 vector<vector<int>> r=threeSum(num,i,target-num[i]); 11 for(int j=0;j<r.size();j++) 12 { 13 r[j].push_back(num[i]); 14 res.push_back(r[j]);//put into result vector 15 } 16 } 17 18 } 19 return res; 20 21 } 22 vector<vector<int>> threeSum(vector<int> &num, int end, int target) 23 { 24 vector<vector<int>> res; 25 for(int i=end-1;i>0;i--) 26 { 27 if(i==end-1||num[i]!=num[i+1])//avoid duplicated items 28 { 29 vector<vector<int>> r=twoSum(num,i,target-num[i]); 30 for(int j=0;j<r.size();j++) 31 { 32 r[j].push_back(num[i]); 33 res.push_back(r[j]); 34 } 35 } 36 } 37 return res; 38 } 39 vector<vector<int>> twoSum(vector<int> &num, int end, int target) 40 { 41 vector<vector<int>> res; 42 int left=0; 43 int right=end-1; 44 while(left<right) 45 { 46 int sum=num[left]+num[right]; 47 if(sum>target)right--; 48 else if(sum<target)left++; 49 else 50 { 51 vector<int> hit; 52 hit.push_back(num[left]); 53 hit.push_back(num[right]); 54 res.push_back(hit); 55 left++; 56 right--; 57 while(left<right&&num[left]==num[left-1])left++;//avoid duplicated items. 58 while(left<right&&num[right]==num[right+1])right--;//avoid duplicated items. 59 } 60 } 61 return res; 62 } 63 };
useful link:http://tech-wonderland.net/blog/summary-of-ksum-problems.html
浙公网安备 33010602011771号