leetcode632. 最小区间/堆

文章目录

    • 题目:632. 最小区间
    • 基本思想1:最小堆

题目:632. 最小区间

你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。

我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。

示例 1:

输入:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]
输出: [20,24]
解释: 
列表 1[4, 10, 15, 24, 26]24 在区间 [20,24] 中。
列表 2[0, 9, 12, 20]20 在区间 [20,24] 中。
列表 3[5, 18, 22, 30]22 在区间 [20,24] 中。

注意:

  • 给定的列表可能包含重复元素,所以在这里升序表示 >= 。
  • 1 <= k <= 3500
  • -105 <= 元素的值 <= 105
  • 对于使用Java的用户,请注意传入类型已修改为List。重置代码模板后可以看到这项改动。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/smallest-range-covering-elements-from-k-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

基本思想1:最小堆

  • 指针指向每一个列表的首部,将每一个列表中首部元素最小的作为当前的区间的下界,最大元素作为当前区间的上界;
  • 如果当前区间比之前的区间小,更新结果
  • 并将最小元素从列表中删除,将新的首部放在优先队列中,同时有必要的话更新最大元素的下标。
class Solution {
public:
    vector<int> smallestRange(vector<vector<int>>& nums) {
        struct Node{
            int val, pos;
            Node(int a, int b): pos(a), val(b){}
        };
        struct cmp{
            bool operator()(Node a, Node b){
                return a.val > b.val;
            }            
        };
        vector<int> res;
        int max_pos = 0;
        priority_queue<Node, vector<Node>, cmp> pq;
        pq.push(Node(0, nums[0][0]));
        for(int i = 1; i < nums.size(); ++i){
            pq.push(Node(i, nums[i][0]));
            if(nums[i][0] > nums[max_pos][0])
                max_pos = i;
        }
        res = {nums[pq.top().pos][0], nums[max_pos][0]};
        while(1){ 
            int less_pos = pq.top().pos;
            if(nums[max_pos][0] - nums[less_pos][0] < res[1] - res[0]){
                res = {nums[less_pos][0], nums[max_pos][0]};
            }
            
            nums[less_pos].erase(nums[less_pos].begin());
            if(nums[less_pos].size() == 0)
                break;
            pq.pop();
            pq.push(Node(less_pos, nums[less_pos][0]));
            if(nums[less_pos][0] > nums[max_pos][0])
                max_pos = less_pos;
        }
        return res;
    }
};

你可能感兴趣的:(#,算法)