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

C++ में K सूचियों से तत्वों को कवर करने वाली सबसे छोटी रेंज

मान लीजिए कि हमारे पास क्रमबद्ध पूर्णांकों की k सूचियाँ हैं। हमें सबसे छोटी श्रेणी खोजनी है जिसमें प्रत्येक k सूचियों में से कम से कम एक संख्या शामिल हो। यहाँ रेंज [a,b] रेंज [c,d] से छोटी है जब b-a

तो अगर इनपुट [[4,10,15,25,26], [0,9,14,20], [5,18,24,30]] जैसा है, तो आउटपुट [14, 18] होगा

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

  • minRange:=inf, maxRange:=-inf, rangeSize:=inf, tempMinRange:=inf, tempMaxRange:=-inf
  • n :=अंकों का आकार
  • आकार n के सरणी पॉइंटर्स को परिभाषित करें
  • प्राथमिकता कतार pq बनाएं
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • पीक्यू में {nums[i, 0], i } डालें
  • tempMaxRange :=अधिकतम tempMaxRange और nums[i, 0]
  • जबकि 1 गैर-शून्य है, करें −
    • एक जोड़ी अस्थायी परिभाषित करें:=pq के शीर्ष
    • पीक्यू से तत्व हटाएं
    • tempMinRange :=temp.first
    • idx:=अस्थायी का दूसरा तत्व
    • यदि tempMaxRange − tempMinRange
    • श्रेणी आकार:=tempMaxRange - tempMinRange
    • minRange:=tempMinRange
    • अधिकतम श्रेणी:=tempMaxRange
  • (सूचकांक [idx] 1 से बढ़ाएं)
  • यदि पॉइंटर्स [idx] अंकों के आकार के समान है [idx], तो −
    • लूप से बाहर आएं
  • अन्यथा
    • tempMaxRange :=अधिकतम tempMaxRange और nums[idx, पॉइंटर्स[idx]]
    • पीक्यू में {nums[idx,pointers[idx]], idx } डालें
  • किसी सरणी को 2 आकार के उत्तर के रूप में परिभाषित करें
  • Ans[0] :=minRange, ans[1] :=maxRange
  • वापसी उत्तर
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #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;
    }
    struct Comparator{
       bool operator() (pair <int, int> a, pair <int, int> b){
          return !(a.first < b.first);
       }
    };
    class Solution {
    public:
       vector<int> smallestRange(vector<vector<int>>& nums) {
          int minRange = INT_MAX;
          int maxRange = INT_MIN;
          int rangeSize = INT_MAX;
          int tempMinRange, tempMaxRange, tempRangeSize;
          tempMinRange = INT_MAX;
          tempMaxRange = INT_MIN;
          int n = nums.size();
          vector <int> pointers(n);
          priority_queue < pair <int, int>, vector < pair <int, int> >, Comparator > pq;
          for(int i = 0; i < n; i++){
             pq.push({nums[i][0], i});
             tempMaxRange = max(tempMaxRange, nums[i][0]);
          }
          while(1){
             pair <int, int> temp = pq.top();
             pq.pop();
             tempMinRange = temp.first;
             int idx = temp.second;
             if(tempMaxRange - tempMinRange < rangeSize){
                rangeSize = tempMaxRange - tempMinRange;
                minRange = tempMinRange;
                maxRange = tempMaxRange;
             }
             pointers[idx]++;
             if(pointers[idx] == nums[idx].size())break;
             else{
                tempMaxRange = max(tempMaxRange, nums[idx][pointers[idx]]);
                pq.push({nums[idx][pointers[idx]], idx});
             }
          }
          vector <int> ans(2);
          ans[0] = minRange;
          ans[1] = maxRange;
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{4,10,15,25,26},{0,9,14,20},{5,18,24,30}};
       print_vector(ob.smallestRange(v));
    }

    इनपुट

    {{4,10,15,25,26},{0,9,14,20},{5,18,24,30}};

    आउटपुट

    [14, 18, ]

    1. C++ में किसी श्रेणी से युग्म का अधिकतम XOR मान

      समस्या कथन एक श्रेणी [एल, आर] को देखते हुए, हमें इस श्रेणी में दो पूर्णांकों को खोजने की जरूरत है ताकि उनका एक्सओआर दो पूर्णांकों के सभी संभावित विकल्पों में से अधिकतम हो अगर दी गई रेंज L =1 और R =21 है तो आउटपुट 31 होगा क्योंकि -31 15 और 16 का XOR है और यह रेंज के भीतर अधिकतम है। एल्गोरिदम 1. Cal

    1. रेंज सम क्वेरी - C++ में अपरिवर्तनीय

      मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है। हमें अनुक्रमणिका i से j तक उपस्थित तत्वों का योग ज्ञात करना है। हमें दो बातों का ध्यान रखना होगा कि सरणी अपरिवर्तनीय होगी, इसलिए तत्वों को नहीं बदला जाएगा, और ऐसे कई प्रश्न होंगे। इसलिए हमें बड़ी संख्या में प्रश्नों के निष्पादन समय की परवाह करनी होगी।

    1. C++ में दिए गए तीन क्रमबद्ध सरणियों में से तीन निकटतम तत्व खोजें

      मान लीजिए कि हमारे पास ए, बी और सी से तीन क्रमबद्ध सरणियाँ हैं, और क्रमशः ए, बी और सी से तीन तत्व i, j और k हैं जैसे कि max(|A[i] – B[i]|, |B[j] – C [k]|, |C[k] - A[i]|) को छोटा किया जाता है। तो अगर ए =[1, 4, 10], बी =[2, 15, 20], और सी =[10, 12], तो आउटपुट तत्व 10, 15, 10 हैं, ये तीनों ए, बी और सी