Computer >> Máy Tính >  >> Lập trình >> C ++

Giao điểm của ba mảng được sắp xếp trong C ++


Giả sử có ba mảng số nguyên arr1, arr2 và arr3 và chúng được sắp xếp theo thứ tự tăng dần, chúng ta phải trả về một mảng được sắp xếp chỉ gồm các số nguyên xuất hiện trong cả ba mảng này . Vì vậy, nếu các mảng là [1,2,3,4,5], [1,2,5,7,9] và [1,3,4,5,8], thì đầu ra sẽ là [1,5 ]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • xác định một mảng được gọi là res
  • tạo ba bản đồ f1, f2 và f3
  • cho tôi trong phạm vi từ 0 đến chiều dài của arr1
    • f1 [arr1 [i]] tăng 1
  • cho tôi trong phạm vi từ 0 đến chiều dài của arr2
    • f2 [arr2 [i]] tăng 1
  • cho tôi trong phạm vi từ 0 đến chiều dài của arr3
    • f3 [arr3 [i]] tăng 1
  • cho i =1 đến 2000,
    • nếu f1 [i] và f2 [i] và f3 [i], thì
      • chèn i vào mảng res
  • trả lại res

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
      vector <int> ans;
      unordered_map <int,int> f1,f2,f3;
      for(int i =0;i<arr1.size();i++){
         f1[arr1[i]]++;
      }
      for(int i =0;i<arr2.size();i++){
         f2[arr2[i]]++;
      }
      for(int i =0;i<arr3.size();i++){
         f3[arr3[i]]++;
      }
      for(int i =1;i<=2000;i++){
         if(f1[i] && f2[i] && f3[i])ans.push_back(i);
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<int> v1 = {1,2,3,4,5};
   vector<int> v2 = {1,2,5,7,9};
   vector<int> v3 = {1,3,4,5,8};
   print_vector(ob.arraysIntersection(v1, v2, v3));
}

Đầu vào

[1,2,3,4,5]
[1,2,5,7,9]
[1,3,4,5,8]

Đầu ra

[1,5]