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