4Sum

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:

  • 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

posted @ 2014-07-04 02:07  Hicandyman  阅读(136)  评论(0)    收藏  举报