কম্পিউটার

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 করুন
  • pq-এ { nums[i, 0], i } ঢোকান
  • tempMaxRange :=সর্বোচ্চ tempMaxRange এবং সংখ্যা[i, 0]
  • যদিও 1 অ-শূন্য, কর −
    • এক জোড়া তাপমাত্রা সংজ্ঞায়িত করুন :=pq এর শীর্ষ
    • pq থেকে উপাদান মুছুন
    • tempMinRange :=temp.first
    • idx :=তাপমাত্রার দ্বিতীয় উপাদান
    • যদি tempMaxRange − tempMinRange
    • রেঞ্জ সাইজ :=tempMaxRange - tempMinRange
    • minRange :=tempMinRange
    • maxRange :=tempMaxRange
  • (পয়েন্টার [idx] 1 দ্বারা বৃদ্ধি করুন)
  • যদি পয়েন্টার[idx] সংখ্যার আকারের মতো হয় [idx], তাহলে −
    • লুপ থেকে বেরিয়ে আসুন
  • অন্যথায়
    • tempMaxRange :=সর্বোচ্চ tempMaxRange এবং সংখ্যা[idx, pointers[idx]]
    • pq-এ { nums[idx, pointers[idx]], idx } ঢোকান
  • আকার 2 এর একটি অ্যারে উত্তর সংজ্ঞায়িত করুন
  • উত্তর[0] :=মিনরেঞ্জ, উত্তর[1] :=সর্বোচ্চ রেঞ্জ
  • উত্তর ফেরত দিন
  • আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    উদাহরণ

    #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++ এ K হিসাবে ক্ষুদ্রতম ফ্যাক্টর সহ একটি পরিসরে সমস্ত সংখ্যা গণনা করুন

    2. C++ এ একটি পরিসর থেকে একটি জোড়ার সর্বোচ্চ XOR মান

    3. রেঞ্জ সমষ্টি প্রশ্ন - C++ এ অপরিবর্তনীয়

    4. C++ এ প্রদত্ত তিনটি সাজানো অ্যারে থেকে তিনটি নিকটতম উপাদান খুঁজুন