632. Smallest Range

本文介绍了一种使用贪心算法解决的问题——寻找包含来自K个已排序数组中每个数组至少一个元素的最小范围。通过示例解释了算法的具体实现,并给出了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

632. Smallest Range

You have k lists of sorted integers in ascending order. Find the smallest range that includes at least one number from each of the k lists.

We define the range [a,b] is smaller than range [c,d] if b-a < d-c or a < c if b-a == d-c.

Example 1:
Input:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]
Output: [20,24]
Explanation:
List 1: [4, 10, 15, 24,26], 24 is in range [20,24].
List 2: [0, 9, 12, 20], 20 is in range [20,24].
List 3: [5, 18, 22, 30], 22 is in range [20,24].
Note:
The given list may contain duplicates, so ascending order means >= here.
1 <= k <= 3500
-105 <= value of elements <= 105.

题目大意:
现在有已排好序的K个数组,问找到最小的一个范围[a,b],使得每一个数组当中至少有一个元素落入这个区间。
思路:
这道题将会用到贪心的思想,首先假设k个数组满足一下条件
[a01,a02,a03,a04……]
[a11,a12,a13,a14……]
……
[ak1,ak2,ak3,ak4……]
假设存在a01

vector<int> smallestRange(vector<vector<int>>& nums) {
        typedef vector<int>::iterator vi;

        struct comp {
            bool operator()(pair<vi, vi> p1, pair<vi, vi> p2) {
                return *p1.first > *p2.first;
            }
        };

        int lo = INT_MAX, hi = INT_MIN;
        priority_queue<pair<vi, vi>, vector<pair<vi, vi>>, comp> pq;

        for (auto &row:nums){
            lo = min(lo,row[0]);
            hi = max(hi,row[0]);
            pq.push({row.begin(),row.end()});
        }
        vector<int> ans = {lo, hi};

        while(true){
            auto num =pq.top();
            pq.pop();
            num.first++;
            if(num.first==num.second){
                break;
            }
                pq.push(num);
                lo = *pq.top().first;
                if(*num.first>hi) hi =*num.first;
                if(hi-lo<ans[1]-ans[0]){
                    ans[0]=lo;
                    ans[1]=hi;


            }

        }
         return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值