当前位置: 首页 > article >正文

LeetCode 0632.最小区间:优先队列

【LetMeFly】632.最小区间:优先队列

力扣题目链接:https://leetcode.cn/problems/smallest-range-covering-elements-from-k-lists/

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

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

 

示例 1:

输入:nums = [[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] 中。

示例 2:

输入:nums = [[1,2,3],[1,2,3],[1,2,3]]
输出:[1,1]

 

提示:

  • nums.length == k
  • 1 <= k <= 3500
  • 1 <= nums[i].length <= 50
  • -105 <= nums[i][j] <= 105
  • nums[i] 按非递减顺序排列

 

解题方法:优先队列

使用一个优先队列,每个“整数列表”放一个元素到优先队列中,优先队列以“列表元素最小”为最优先。

优先队列中存放的,是每个列表本次要覆盖的元素。

每次从优先队列中取出一个元素:

那么这次方案(取出之前)的最小值就是取出的这个元素,最大值我们使用一个值记录并在入队时候更新。

更新最佳方案:如果当前方案优于之前的最佳方案,就更新最佳方案为这个方案。

新元素入队:如果出队元素所在列表还有新元素,则下一个元素入队,并记得更新“最大值”;否则结束循环。

  • 时间复杂度 O ( n k log ⁡ k ) O(nk\log k) O(nklogk)
  • 空间复杂度 O ( k ) O(k) O(k)

AC代码

C++
class Solution {
public:
    vector<int> smallestRange(vector<vector<int>>& nums) {
        vector<int> loc(nums.size());
        auto cmp = [&nums, &loc](const int& x, const int& y) {
            return nums[x][loc[x]] > nums[y][loc[y]];
        };
        priority_queue<int, vector<int>, decltype(cmp)> pq(cmp);
        int m = -1e8, M = -1e6;
        for (int i = 0; i < nums.size(); i++) {
            pq.push(i);
            M = max(M, nums[i][0]);
        }
        int nowm, nowM = M;
        while (pq.size()) {
            int index = pq.top();
            pq.pop();
            nowm = nums[index][loc[index]];
            loc[index]++;
            if (nowM - nowm < M - m) {
                M = nowM;
                m = nowm;
            }
            if (loc[index] == nums[index].size()) {
                break;
            }
            nowM = max(nowM, nums[index][loc[index]]);
            pq.push(index);
        }
        return {m, M};
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/144011635


http://www.kler.cn/a/410417.html

相关文章:

  • vue实现列表滑动下拉加载数据
  • 游戏引擎学习第23天
  • ‌Kotlin中的?.和!!主要区别
  • Node.js的http模块:创建HTTP服务器、客户端示例
  • candence: 常用的一些命令: Move / Mirror / Rotate / Spain / Fix / unFix / Flipdesign
  • 硬中断关闭后的堆栈抓取方法
  • 成功案例 | Fortinet助力宾堡打造数字化安全“美味王国”
  • java TreeMap 详解
  • 【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】
  • C# .Net Core通过StreamLoad向Doris写入CSV数据
  • C# 创建快捷方式文件和硬链接文件
  • 大语言模型---通过数值梯度的方式计算损失值L对模型权重矩阵W的梯度;数值梯度的公式;数值梯度计算过程
  • macOS上进行Ant Design Pro实战教程(一)
  • 【51单片机】程序实验56.独立按键-矩阵按键
  • 【初阶数据与算法】线性表之顺序表的定义与实现
  • 跨平台开发_RTC程序设计:实时音视频权威指南 2
  • Web day02 Js Vue Ajax
  • Java的字符串操作(二)(代码示例)
  • spring的事务隔离?
  • IEC61850读服务器目录命令——GetServerDirectory介绍
  • Gitlab有趣而实用的功能
  • Ajax学习笔记,第一节:语法基础
  • 电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 杂项驱动开发
  • 【JavaEE】Servlet:表白墙
  • CSS 样式入门:属性全知晓