在 C++ 中查找包含来自 k 个列表的元素的最小范围
假设我们有 k 个不同的列表。元素已排序。我们必须搜索包含来自 k 个不同列表中至少一个数字的最小范围。这里,当 b-a < d-c 或 b-a == d-c 时 a < c 时,范围 [a,b] 小于范围 [c,d]。
因此,如果输入类似于 [[4,10,15,25,26],[0,9,14,20],[5,18,24,30]],则输出将为 [14, 18]
为了解决这个问题,我们将遵循以下步骤:
minRange := ∞, maxRange := -∞, rangeSize := ∞, tempMinRange := ∞, tempMaxRange := -∞
n := nums 的大小
定义大小为 n 的指针数组
创建一个优先级队列 pq
用于初始化 i := 0,当 i < n 时,更新(i 增加 1),执行:
将 { nums[i, 0], i } 插入 pq
tempMaxRange := tempMaxRange 和 nums[i, 0] 的最大值
当 1 非零时,执行:
定义一对 temp := pq 的顶部元素
从 pq 删除元素
tempMinRange := temp.first
idx := temp 的第二个元素
如果 tempMaxRange - tempMinRange < rangeSize,则:
rangeSize := tempMaxRange - tempMinRange
minRange := tempMinRange
maxRange := tempMaxRange
(pointers[idx] 增加 1)
如果 pointers[idx] 等于 nums[idx] 的大小,则:
退出循环
否则
tempMaxRange := tempMaxRange 和 nums[idx, pointers[idx]] 的最大值
将 { nums[idx, pointers[idx]], idx } 插入 pq
定义大小为 2 的数组 ans
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, ]
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP