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 है, तो वापस लौटें
  • ret नामक एक मैट्रिक्स बनाएं
  • i को 0 से n-1 तक लूप करें
    • (A1[i], A2[0], 0) को डेटा के रूप में क्यू में डालें
  • जब तक क्यू खाली नहीं है, और k 0 नहीं है
    • curr := क्यू का शीर्ष, क्यू तत्व हटाएं
    • curr के first_val, second_val को ret में डालें
    • यदि curr का इंडेक्स + 1 < m, तो
      • (curr का first_val, A2[curr का इंडेक्स + 1], curr का इंडेक्स + 1) डेटा के साथ क्यू में डालें
    • k को 1 से घटाएं
  • ret वापस करें

उदाहरण

#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

आउटपुट

[[1,2,],[1,4,],[1,6,],]
  1. C++ में थ्रेशोल्ड दूरी पर सबसे कम पड़ोसियों वाला शहर ढूंढना C++ में थ्रेशोल्ड दूरी पर सबसे कम पड़ोसियों वाला शहर ढूंढना

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

  1. - C++ में सबसे बड़े ज्यामितीय माध्य वाला सबसेट खोजें

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

  1. - C++ में दिए गए अंतर वाली जोड़ी ढूंढें

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