Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में सबसे छोटी रकम के साथ K जोड़े खोजें

मान लीजिए कि हमारे पास दो क्रमबद्ध सरणियाँ A1 और A2 हैं, और दूसरा मान k है। हमें एक युग्म (u, v) को परिभाषित करना है जिसमें A1 से एक तत्व और A2 से दूसरा तत्व शामिल है। हमें k जोड़े खोजने होंगे जैसे [(u1, v1), (u2, v2),…, (uk, vk)]। अतः यदि A1 =[1, 7, 11] और A2 =[2, 4, 6], और k =3, तो आउटपुट [(1, 2), (1, 4), (1, 6)] होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक डेटा प्रकार परिभाषित करें, जो दो मान a और b, और अनुक्रमणिका लेगा।
  • एक प्राथमिकता कतार बनाएं, जो डेटा प्रकार की कुंजी और डेटा की सूची को मान के रूप में लेगी।
  • n :=A1 का आकार, m:=A2 का आकार
  • यदि n 0 है या m 0 है, तो वापस लौटें
  • रिट नामक एक मैट्रिक्स बनाएं
  • मैं के लिए 0 से n - 1 की सीमा में
    • डेटा के रूप में कतार में डालें (A1[i], A2[0], 0)
  • जबकि कतार खाली नहीं है, और k 0 नहीं है, तब
    • curr :=कतार में सबसे ऊपर, कतार तत्व हटाएं
    • कर्र का पहला_वैल, रिट में दूसरा_वल डालें
    • यदि curr + 1
    • कतार में (कर्र का पहला_वल, ए2 [कर का इंडेक्स + 1], कर्व का इंडेक्स + 1) के साथ डेटा डालें
  • k को 1 से घटाएं
  • रिटर्न रिटर्न
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    #include <stack>
    using namespace std;
    struct Data{
       int firstVal, secondVal, idx;
       Data(int a, int b, int c){
          firstVal = a;
          secondVal = b;
          idx = c;
       }
    };
    struct Comparator{
       bool operator()(Data a, Data b){
          return !(a.firstVal + a.secondVal < b.firstVal + b.secondVal);
       }
    };
    class Solution {
       public:
       vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
          priority_queue <Data, vector <Data>, Comparator> pq;
          int n = nums1.size();
          int m = nums2.size();
          if(!n || !m)return {};
          vector < vector <int> > ret;
          for(int i = 0; i < n; i++){
             pq.push(Data(nums1[i], nums2[0], 0));
          }
          while(!pq.empty() && k--){
             Data curr = pq.top();
             pq.pop();
             ret.push_back({curr.firstVal, curr.secondVal});
             if(curr.idx + 1 < m){
                pq.push(Data(curr.firstVal, nums2[curr.idx + 1], curr.idx + 1));
             }
          }
          return ret;
       }
    };
    void print(vector <int> const &arr) {
       cout<<"[";
       for(int i=0; i < arr.size(); i++)
          std::cout << arr.at(i) <<",";
       cout<<"]";
    }
    int main() {
       vector<int> nums1{1,7,11};
       vector<int> nums2{2,4,6};
       int k = 3;
       Solution ob1;
       vector<vector<int>> numsRet;
       numsRet = ob1.kSmallestPairs(nums1, nums2, k);
       cout<<"[";
       for (vector<int> x : numsRet) {
          print(x);
          cout<<",";
       }
       cout<<"]"<<endl;
       return 0;
    }

    इनपुट

    [1,7,11]
    [2,4,6]
    3
    vector<int> nums1{1,7,11};
    vector<int> nums2{2,4,6};
    int k = 3;
    Solution ob1;
    vector<vector<int>> numsRet;
    numsRet = ob1.kSmallestPairs(nums1, nums2, k);

    आउटपुट

    [[1,2,],[1,4,],[1,6,],]

    1. C++ में थ्रेसहोल्ड दूरी पर पड़ोसियों की सबसे छोटी संख्या वाले शहर का पता लगाएं

      मान लीजिए कि n शहरों की संख्या 0 से n-1 तक है। यदि हमारे पास सरणी किनारे हैं जहां किनारों [i] =[fromi, toi, weighti] शहरों से i और toi के बीच एक द्विदिश और भारित किनारे का प्रतिनिधित्व करता है, और पूर्णांक दूरी सीमा दी गई है। हमें ऐसे शहरों की सबसे छोटी संख्या वाला शहर ढूंढना है जो किसी रास्ते से पह

    1. C++ में सबसे बड़े ज्यामितीय माध्य वाला उपसमुच्चय ज्ञात कीजिए

      यहां हमारे पास कुछ तत्वों के साथ एक सरणी ए है। हमारा कार्य उस उपसमुच्चय को ज्ञात करना है जहाँ ज्यामितीय माध्य अधिकतम हो। मान लीजिए A =[1, 5, 7, 2, 0], तो सबसे बड़ा ज्यामितीय माध्य वाला उपसमुच्चय [5, 7] होगा। इसे हल करने के लिए, हम एक तरकीब अपनाएंगे, हमें माध्य नहीं मिलेगा, क्योंकि हम जानते हैं कि स

    1. C++ में दिए गए अंतर के साथ एक जोड़ी खोजें

      विचार करें कि हमारे पास एक सरणी A है, n विभिन्न तत्व हैं। हमें सरणी A से एक युग्म (x, y) ज्ञात करना है, ताकि x और y के बीच का अंतर दिए गए अंतर d के समान हो। मान लीजिए कि तत्वों की एक सूची A =[10, 15, 26, 30, 40, 70] की तरह है, और दिया गया अंतर 30 है, तो जोड़ी होगी (10, 40) और (30, 70) इस समस्या को