【LeetCode】最小区间 [H](贪心)
admin
2024-02-03 12:22:35
0

632. 最小区间 - 力扣(LeetCode)

一、题目

你有 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] 按非递减顺序排列

二、代码

class Solution {class Node {// 值大小public int value;// 该数来自哪个数组,记录数组编号public int arrid;// 该数来自数组的哪个下标位置public int index;public Node(int value, int arrid, int index) {this.value = value;this.arrid = arrid;this.index = index;}}// 有序表按照值得递增顺序排序,如果两个值相等,谁的数组编号小,谁就放在前面class NodeComparator implements Comparator {@Overridepublic int compare(Node o1, Node o2) {return o1.value != o2.value ? o1.value - o2.value : o1.arrid - o2.arrid;}}public int[] smallestRange(List> nums) {// 创建有序表TreeSet ansSet = new TreeSet<>(new NodeComparator());// 一开始先将所有数组的第一个数加入到有序表中for (int i = 0; i < nums.size(); i++) {ansSet.add(new Node(nums.get(i).get(0), i, 0));}// 记录有序表最小的节点和最大的节点Node start = ansSet.first();Node end = ansSet.last();// 记录当前找到的符合条件的区间最窄的区间左右边界int min = start.value;int max = end.value;// 当我们想要删掉一个数据时,发现这个数据所在的数组已经没有别的数可以用来补充到有序表了,那么整个流程就不用再继续了,以为后面就无法满足每一个数组至少有一个数在有序表了while (start.index != nums.get(start.arrid).size() - 1) {// 弹出有序表中最小的数ansSet.pollFirst();// 将弹出的数所在数组的下一个位置的数加入到有序表中,保证这个数组有一个数在有序表中ansSet.add(new Node(nums.get(start.arrid).get(start.index + 1), start.arrid, start.index + 1));// 记录此时有序表的区间范围start = ansSet.first();end = ansSet.last(); // 如果此时的区间比之前记录的更窄,就更新答案if (end.value - start.value < max - min) {max = end.value;min = start.value;// 如果此时的区间等于之前记录的区间,就看是否当前的区间起始数是不是比以前的起始数小,如果小就更新答案} else if (end.value - start.value == max - min) {if (start.value < min) {max = end.value;min = start.value;}}}// 返回符合条件的最窄区间return new int[] {min, max};}
}

三、解题思路 

有序表能非常方便地查到所有数字最小值,也可以非常方便的查到所有数字的最大值。

将每个数组中的第一个数加入有序表,取出最大值和最小值,可以找到一个区间。

这个区间一定每个数组都有一个数落在这个区间上,

然后删除最小值,把这个最小值来自数组的下一个值加入有序表,排序后重新取出最小值跟最大值,

构成一个新的区间,跟之前的区间比较是否更优。

当我们想要删掉一个数据时,发现这个数据所在的数组已经没有别的数可以用来补充到有序表了,那么整个流程就不用再继续了,这时就找到符合要求的最窄区间了。整个流程中我们可以保证在有序表的范围中每一个数据集合都至少有一个数在这个有序表所在的范围中。

所以整个流程就相当于每一个数产生答案的时候都是某一个数字如果作为连续区间的开头往右怎么样最经济,

这样你就把所有答案都穷举了一遍,然后从其中找最优解。而且整个流程一定就可以保证每一个数组只会有一个数在有序表中,可以尽最大可能保证区间范围最窄。

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...