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

embedded/2024/11/28 18:54:18/

【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.ppmy.cn/embedded/141240.html

相关文章

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…

go语言怎么实现bash cmd里的mv功能?

在Go语言中实现类似于Bash命令行中的mv命令的功能&#xff0c;主要是通过文件系统的操作来完成的。mv命令可以用来移动文件或目录&#xff0c;也可以用来重命名文件或目录。在Go语言中&#xff0c;可以使用标准库中的os和io/ioutil包来实现这些功能。 以下是一个简单的例子&…

【数据结构专栏】二叉搜索树(Binary Search Tree)的剖析?

文章目录 &#x1f9e8;前言1、二叉搜索树的基本概念&#xff1f;2、二叉搜索树的节点结构组成&#xff1f;3、二叉搜索树的插入操作&#xff1f;4、二叉搜索树的删除操作&#xff1f;5、二叉搜索树的遍历&#xff1f;6、二叉搜索树的性能分析&#xff1f;&#x1f389;完整代码…

BERT简单理解;双向编码器优势

目录 BERT简单理解 一、BERT模型简单理解 二、BERT模型使用举例 三、BERT模型的优势 双向编码器优势 BERT简单理解 (Bidirectional Encoder Representations from Transformers)模型是一种预训练的自然语言处理(NLP)模型,由Google于2018年推出。以下是对BERT模型的简…

matlab代码--卷积神经网络的手写数字识别

1.cnn介绍 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习的算法&#xff0c;在图像和视频识别、图像分类、自然语言处理等领域有着广泛的应用。CNN的基本结构包括输入层、卷积层、池化层&#xff08;Pooling Layer&#xff09;、全连…

P1198 [JSOI2008] 最大数

P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士&#xff1a;单调队列 思路&#xff1a; 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的&#xff08;真无语了&#xff09; 我们可以在每次插入时整一个叫…

Android 14之HIDL转AIDL通信

Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依…

全渠道供应链变革下“小程序 AI 智能名片 S2B2C 商城系统”的赋能与突破

摘要&#xff1a;本文围绕全渠道供应链构建这一核心主题&#xff0c;剖析零售企业面临的挑战与机遇&#xff0c;着重探讨在整合采购、营销、仓储、物流等多环节进程中&#xff0c;物流环节整合困境及全渠道模式应对策略。深入研究“小程序 AI 智能名片 S2B2C 商城系统”如何契合…