C ++中的4Sum

假设我们有一个数字数组。它存储n个整数,数组中有四个元素a,b,c和d。我们有另一个目标值,即a + b + c + d =目标。在满足条件的数组中找到所有唯一的四元组。因此,如果数组类似于[-1,0,1,2,0,-2]并且目标为0,则结果将为[[-1,0,0,1],[-2,-1, 1,2],[-2,0,0,2]]

为了解决这个问题,我们将遵循以下步骤-

  • 实际的总和是使用称为的函数来完成的kSum()。这需要数组,开始,k和目标。最初将使用k值4调用该函数。该函数如下

  • 定义数组res

  • 如果k = 2,则

    • 如果arr [left] + arr [right] =目标,则

    • 否则,如果arr [left] + arr [right]>目标,则向右减少1

    • 否则增加1

    • 将r减1

    • 使我增加1

    • temp [0]:= arr [left],temp [1]:= arr [right],然后将temp插入res

    • 而left <right和arr [left] = arr [left + 1]

    • 而左<右和arr [right] = arr [right – 1]

    • 将l增加1并将r减少1

    • 左:=开始,右:=数组大小– 1

    • 定义大小为2的另一个数组温度

    • 而左<右

    • 其他

      • 如果i>开始并且arr [i] = arr [i-1],则跳过下一步并继续

      • 定义一个2d数组temp:= kSum(arr,i + 1,k – 1,target – arr [i])

      • 对于介于0到temp的j

      • 将temp的所有元素复制到res

      • 在temp [j]之后插入arr [i]

      • 因为我在范围内开始到arr大小– k,

      • 返回资源

      例子(C ++)

      让我们看下面的实现以更好地理解-

      #include <bits/stdc++.h>
      using namespace std;
      void print_vector(vector<vector<int> > v){
         cout << "[";
         for(int i = 0; i<v.size(); i++){
            cout << "[";
            for(int j = 0; j <v[i].size(); j++){
               cout << v[i][j] << ", ";
            }
            cout << "],";
         }
         cout << "]"<<endl;
      }
      class Solution {
      public:
         void addAll(vector < vector <int> >& res, vector < vector <int> >& temp){
            for(int i = 0; i < temp.size(); i++)res.push_back(temp[i]);
         }
         vector<vector<int>> fourSum(vector<int>& nums, int target) {
            sort(nums.begin(), nums.end());
            return kSum(nums, 0, 4, target);
         }
         vector < vector <int> > kSum(vector <int>& arr, int start, int k, int target){
            vector < vector <int> > res;
            if(k == 2){
               int left = start;
               int right = arr.size() - 1;
               vector <int> temp(2);
               while(left < right){
                  if(arr[left] + arr[right] == target){
                     temp[0] = arr[left];
                     temp[1] = arr[right];
                     res.push_back(temp);
                     while(left < right && arr[left] == arr[left + 1])left++;
                     while(left < right && arr[right] == arr[right - 1])right--;
                     left++;
                     right--;
                  }
                  else if(arr[left] + arr[right] > target)right--;
                  else left ++;
               }
            }
            else{
               for(int i = start; i < (int)arr.size() - k + 1; i++){
                  if(i > start && arr[i] == arr[i - 1])continue;
                  vector < vector <int> > temp = kSum(arr, i + 1, k - 1, target - arr[i]);
                  for(int j = 0; j < temp.size(); j++){
                     temp[j].push_back(arr[i]);
                  }
                  addAll(res, temp);
               }
            }
            return res;
         }
      };
      main(){
         Solution ob;
         vector<int> v = {1,0,-1,0,-2,2};
         print_vector(ob.fourSum(v, 0));
      }

      输入值

      [1,0,-1,0,-2,2]
      0

      输出结果

      [[1,2,-1,-2],[0,2,0,-2],[0,1,0,-1]]