假设我们有k个不同的列表。元素已排序。我们必须从k个不同的列表中的每一个中搜索包含至少一个数字的最小范围。当ba <dc时,范围[a,b]小于范围[c,d];如果ba == dc,则范围a [c]。
因此,如果输入类似于[[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:= nums的大小
定义大小为n的数组指针
使优先级队列pq
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
将{nums [i,0],i}插入pq
tempMaxRange:= tempMaxRange和nums [i,0]的最大值
当1不为零时,执行-
tempMaxRange:= tempMaxRange和nums [idx,指针[idx]]的最大值
将{nums [idx,pointers [idx]],idx}插入pq
从循环中出来
rangeSize:= tempMaxRange-tempMinRange
minRange:= tempMinRange
maxRange:= tempMaxRange
定义一对temp:= pq的顶部
从pq中删除元素
tempMinRange:=温度第一
idx:= temp的第二个元素
如果tempMaxRange-tempMinRange <rangeSize,则-
(将指标[idx]增加1)
如果pointerss [idx]与nums [idx]的大小相同,则-
除此以外
定义大小为2的数组
ans [0]:= minRange,ans [1]:= maxRange
返回ans
让我们看下面的实现以更好地理解-
#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, ]