Example #1
0
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        if (nums.empty()) return res;
        std::sort(nums.begin(),nums.end());

        for (int i = 0; i < nums.size(); i++) {
            int target3 = target - nums[i];
            for (int j = i+1; j < nums.size(); j++) {
                int target2 = target3 - nums[j];

                int l = j+1, r = nums.size()-1;
                while ( l < r) {
                    if (target2 > (nums[l]+nums[r]) ) l++;
                    else if (target2 < (nums[l]+nums[r]) ) r--;
                    else {
                        vector<int> quadruplet(4, 0);
                        quadruplet[0] = nums[i];
                        quadruplet[1] = nums[j];
                        quadruplet[2] = nums[l];
                        quadruplet[3] = nums[r];
                        res.push_back(quadruplet);

                        while (l < r && nums[l] == quadruplet[2]) l++;

                        while (l < r && nums[r] == quadruplet[3]) r--;
                    }
                }
                while(j + 1 < nums.size() && nums[j + 1] == nums[j]) j++;
            }
            while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++;
        }
        return res;
    }
Example #2
0
 vector<vector<int> > fourSum(vector<int> &num, int target) {
     // IMPORTANT: Please reset any member data you declared, as
     // the same Solution instance will be reused for each test case.
     int len = num.size();
     vector<vector<int>> result;
     if(len<4)
     return result;
     sort(num.begin(),num.end());
     
     for(int i=0;i<len;i++)
     {
         if(i>0 && num[i]==num[i-1]) continue; // avoid duplicates
         for(int j=i+1;j<len;j++)
         {
             if(j>i+1 && num[j]==num[j-1]) continue; // avoid duplicates
             int TwoSum = num[i] + num[j];
             int SumLeft = target - TwoSum;
             int m = j+1;
             int n = len-1;
             while(m<n)
             {
                 int sum = num[m]+num[n];
                 if(sum == SumLeft)
                 {
                     vector<int> quadruplet(4);
                     quadruplet[0] = num[i];
                     quadruplet[1] = num[j];
                     quadruplet[2] = num[m];
                     quadruplet[3] = num[n];
                     result.push_back(quadruplet);
                     while(m<n && num[m+1]==num[m]) m++; // avoid duplicates
                     while(m<n && num[n-1]==num[n]) n--; // avoid duplicates
                     m++; // dont forget to increment m
                     n--;
                 }
                 else if(sum<SumLeft)
                 m++;
                 else 
                 n--;
             }
         }
     }
     return result;
 }
Example #3
0
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        if (nums.size() < 4) return res;
        
        sort(nums.begin(), nums.end());
        int cur1 = nums[0];
        vector<int> quadruplet(4, 0);

        for (int i = 0; i < nums.size() - 3; i ++)
        {
            if (cur1 == nums[i] && i != 0) continue;
            int cur2 = nums[i+1];
            for (int j = i+1; j < nums.size() - 2; j ++)
            {
                if (cur2 == nums[j] && j != i+1) continue;
                int m = j + 1, n = nums.size() - 1;
                while (m < n)
                {
                    if (nums[m] + nums[n] + nums[i] + nums[j] == target)
                    {
                        quadruplet[0] = nums[i];
                        quadruplet[1] = nums[j];
                        quadruplet[2] = nums[m];
                        quadruplet[3] = nums[n];
                        res.push_back(quadruplet);
                        m ++;
                        n --;
                    }
                    else if (nums[m] + nums[n] + nums[i] + nums[j] < target) m ++;
                    else n --;
                }
                cur2 = nums[j];
            }
            cur1 = nums[i];
        }
        
        // avoid repeating
        auto it = unique(res.begin(), res.end());
        res.resize(distance(res.begin(), it));
        
        return res;
    }