【LeetCode】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 klists.

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.

题解:本题需要用到最小堆维持一列的数组元素。题意本质就是找一个数组每个数分别来自每一行中的某一个,使得这个数组最大数和最小数差最小,暴力遍历需要每次都要遍历来找最大数和最小数,由于题目每行数组都是有序的,所以可以维持一个最小堆从每行第一个数开始直到遍历完整个表,遍历过程更新差。注意这里重写优先队列cmp方法时只能用指针,不能传入外部参数,如下代码:

vector<int> smallestRange(vector<vector<int> >& nums) {

     struct cmp{
       bool operator()(pair<int,int> p1,pair<int,int> p2){
        return nums[p1.second][p1.first]>nums[p2.second][p1.first];

    }
    };
    priority_queue<pair<int,int>,vector<pair<int,int> >,cmp> pq;
    int lo=INT_MAX,hi=INT_MIN;
    for(int i=0;i<nums.size();i++)
    {
        lo=min(lo,nums[i][0]);
        hi=max(hi,nums[i][0]);
        pq.push({0,i});
    }
    vector<int> ans={lo,hi};
    while(true)
    {
        auto p=pq.top();

        p.first++;
        pq.pop();
        if(p.first==nums[p.second].size())break;
        pq.push(p);
        lo=nums[pq.top().second][pq.top().first];
        hi=max(hi,nums[p.second][p.first]);
        if(hi-lo<ans[1]-ans[0])ans={lo,hi};
    }
    return ans;



}
会产生: use of parameter from containing function

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 p = pq.top();
            pq.pop();
            ++p.first;
            if (p.first == p.second)
                break;
            pq.push(p);
            
            lo = *pq.top().first;
            hi = max(hi, *p.first);
            if (hi - lo < ans[1] - ans[0])
                ans = {lo, hi};
        }
        return ans;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值