Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

4Sum ใน C++


สมมติว่าเรามีอาร์เรย์ของตัวเลข มันเก็บจำนวนเต็ม 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 ฟังก์ชันจะเป็นดังนี้
  • กำหนดความละเอียดของอาร์เรย์
  • ถ้า k =2 แล้ว
    • ซ้าย :=เริ่มต้นและขวา :=ขนาดอาร์เรย์ – 1
    • กำหนดอุณหภูมิอาร์เรย์อื่นที่มีขนาด 2
    • ขณะซ้าย <ขวา
      • ถ้า arr[ซ้าย] + arr[ขวา] =เป้าหมาย แล้ว
        • temp[0] :=arr[left], temp[1] :=arr[right] และใส่ temp ลงใน res
        • ในขณะที่ซ้าย <ขวาและ arr[left] =arr[left + 1]
          • เพิ่ม l ขึ้น 1
        • ในขณะที่ซ้าย
        • ลด r ขึ้น 1
      • เพิ่ม l ขึ้น 1 และลด r ขึ้น 1
    • มิฉะนั้น ถ้า arr[left] + arr[right]> กำหนดเป้าหมาย แล้วลดไปทางขวา 1
    • มิฉะนั้นจะเพิ่มขึ้นอีก 1
  • อย่างอื่น
    • สำหรับฉันอยู่ในช่วงเริ่มต้นถึงขนาด arr – k,
      • ถ้าฉัน> เริ่มและ arr[i] =arr[i - 1] ให้ข้ามขั้นตอนถัดไปและดำเนินการต่อ
      • กำหนดหนึ่ง 2d array temp :=kSum(arr, i + 1, k – 1, target – arr[i])
      • สำหรับ j ในช่วง 0 ถึง temp
        • ใส่ arr[i] หลัง temp[j]
      • คัดลอกองค์ประกอบทั้งหมดของ temp ไปยัง res
  • ผลตอบแทน
  • ตัวอย่าง(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]]