[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

【问题描述】[困难]

在这里插入图片描述

【解答思路】

1. 堆

在这里插入图片描述

复杂度
在这里插入图片描述

class Solution {public int[] smallestRange(List<List<Integer>> nums) {//区间的左边和右边int rangeLeft = 0, rangeRight = Integer.MAX_VALUE;//最小范围int minRange = rangeRight - rangeLeft;//区间的左边最大值int max = Integer.MIN_VALUE;int size = nums.size();//由于 k 个列表都是升序排列的,因此对每个列表维护一个指针,//通过指针得到列表中的元素,指针右移之后指向的元素一定大于或等于之前的元素。int[] next = new int[size];//使用最小堆维护 k 个指针指向的元素中的最小值PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer index1, Integer index2) {//第index个列表的next[index1]指针指向的元素return nums.get(index1).get(next[index1]) - nums.get(index2).get(next[index2]);}});for (int i = 0; i < size; i++) {//初始时,i 个指针都指向下标 0,因为next[i]=0priorityQueue.offer(i);//最大元素即为所有列表的下标 0 位置的元素中的最大值max = Math.max(max, nums.get(i).get(0));}while (true) {//每次从堆中取出最小值,minIndex是指第几个列表,也代表指针数组next的下标int minIndex = priorityQueue.poll();//根据最大值和最小值计算当前区间int curRange = max - nums.get(minIndex).get(next[minIndex]);//如果当前区间小于最小区间则用当前区间更新最小区间if (curRange < minRange) {minRange = curRange;rangeLeft = nums.get(minIndex).get(next[minIndex]);rangeRight = max;}//然后将对应列表的指针右移next[minIndex]++;//如果一个列表的指针超出该列表的下标范围,则说明该列表中的所有元素都被遍历过,//堆中不会再有该列表中的元素,因此退出循环。if (next[minIndex] == nums.get(minIndex).size()) {break;}//将新元素加入堆中priorityQueue.offer(minIndex);//并更新堆中元素的最大值max = Math.max(max, nums.get(minIndex).get(next[minIndex]));}return new int[]{rangeLeft, rangeRight};}
}
2. 滑动窗口+哈希表

在这里插入图片描述

复杂度
在这里插入图片描述

  public int[] smallestRange(List<List<Integer>> nums) {int size = nums.size();Map<Integer, List<Integer>> indices = new HashMap<Integer, List<Integer>>();int xMin = Integer.MAX_VALUE, xMax = Integer.MIN_VALUE;for (int i = 0; i < size; i++) {for (int x : nums.get(i)) {//Map.getOrDefault(Object key, V defaultValue)方法的作用是://(1)当Map集合中存在这个key时,就使用这个key值,(若是数值型可以在此基础上进行运算)// (2)如果没有就使用默认值defaultValue。List<Integer> list = indices.getOrDefault(x, new ArrayList<Integer>());list.add(i);indices.put(x, list);xMin = Math.min(xMin, x);xMax = Math.max(xMax, x);}}int[] freq = new int[size];int inside = 0;int left = xMin, right = xMin - 1;int bestLeft = xMin, bestRight = xMax;while (right < xMax) {right++;if (indices.containsKey(right)) {for (int x : indices.get(right)) {freq[x]++;if (freq[x] == 1) {inside++;}}while (inside == size) {if (right - left < bestRight - bestLeft) {bestLeft = left;bestRight = right;}if (indices.containsKey(left)) {for (int x: indices.get(left)) {freq[x]--;if (freq[x] == 0) {inside--;}}}left++;}}}return new int[]{bestLeft, bestRight};}

【总结】

1.滑动窗口核心思想
int left = 0, right = 0;while (right < s.size()) {`// 增大窗口window.add(s[right]);right++;while (window needs shrink) {// 缩小窗口window.remove(s[left]);left++;}
}
2.Map-map.getOrDefault()用法

为什么要用?
Map中在每个数据上进行累加我必须先给每个key赋初值才行 (如果不赋初值在计算一开始就会报空指针异常)

API
在这里插入图片描述
解释
Map.getOrDefault(Object key, V defaultValue)方法的作用是:
  (1)当Map集合中存在这个key时,就使用这个key值,(若是数值型可以在此基础上进行运算)
  (2)如果没有就使用默认值defaultValue

3.困难题目不在于思想的理解 而在于每句代码的理解

转载:https://leetcode-cn.com/problems/smallest-range-covering-elements-from-k-lists/solution/zui-xiao-qu-jian-by-leetcode-solution/
参考链接:https://blog.csdn.net/weixin_44325444/article/details/106306900?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十期:过去50年间,十大热门语言及发明者大盘点

本文收集了十大热门编程语言背后的程序员和设计者的名字和大家分享。以下是十大热门编程语言及其创建者&#xff0c;排名不分先后。 软件领域有许多编程语言&#xff0c;每年还涌现出越来越的新语言。新发布的语言有Scala、Kotlin、Go和Closure&#xff0c;但历史证明&#xff…

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用 攻击成果 主动攻击的实践 ms17010eternalblue payload windows/x64/meterpreter/reverse_tcp&#xff08;成功&#xff09;payload generic/shellreversetcp&#xff08;成功&#xff09;ms17010psexec&#xff08;成功且…

【数据结构与算法】复杂度分析

一、什么是复杂度分析&#xff1f; 1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 3.分别用时间复杂度和空间复杂度两个概念来描述性能问题&#xff0c;二者统称为复杂度。 4.复杂…

第十一期:30秒内便能学会的30个实用Python代码片段

许多人在数据科学、机器学习、web开发、脚本编写和自动化等领域中都会使用Python&#xff0c;它是一种十分流行的语言。 Python流行的部分原因在于简单易学。 本文将简要介绍30个简短的、且能在30秒内掌握的代码片段。 1. 唯一性 以下方法可以检查给定列表是否有重复的地方&…

[Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]

【问题描述】[中等] 【解答思路】 1. 前序遍历 将二叉树展开为单链表之后&#xff0c;单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此&#xff0c;可以对二叉树进行前序遍历&#xff0c;获得各节点被访问到的顺序。 由于将二叉树展开为链表之后会破坏二叉树的…

第三十八期:美国数据隐私保护法案来临,明年1月生效,现仅2%企业合规

2018 年美国加州通过消费者隐私法案&#xff08;CCPA&#xff09;&#xff0c;缓冲一年多后&#xff0c;将于 2020 年 1 月生效。届时&#xff0c;类似于欧盟的法案&#xff0c;CCPA 将对所有和美国加州居民有业务的数据商业行为进行监管。 依然在应付欧盟数据保护法案(GDPR)的…

二元随机变量

本章记录  1二元随机变量的定义  2二元离散型随机变量的定义、联合概率分布律、边际分布律、条件分布律  3二元离散型随机变量联合概率分布律函数、边际分布函数、条件分布函数  4二元连续型随机变量的定义、联合概率密度函数、边际密度函数、条件密度函数 二元随机变…

第三十九期:原生图数据库的15条规则

不妨看一下原生图形数据库的15条规则。就像复杂的系统网格或空中交通管制图&#xff0c;图形数据库用节点和连接组成的网络(名为标记属性图)来表示。节点显示为圆形或正方形&#xff0c;代表人员、产品、公司或订单等实体。 就像复杂的系统网格或空中交通管制图&#xff0c;图形…

[周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心]

【问题描述】[中等]5477. 排布二进制网格的最少交换次数 【解答思路】 贪心 限制条件 第一行要求末尾的0要尽量多 计算每行最后有几个0遍历交互 符合条件 第i行的末尾0的数量为n-i-1 统计交换次数第i行的末尾0的数量小于n-i-1&#xff0c;不符合条件 时间复杂度&#xff1a…

ubuntu异常关机,断电重启后进入紧急模式,挂载磁盘SSD失败了怎么办?(Failed mount on XXX)

解决方案&#xff1a; 进入/etc/fstab中保留你所有的除了必要的系统分区挂载点&#xff0c;这里保存了所有开机引导的时候自动挂载到linux文件系统里的设备还有分区信息&#xff0c;当系统启动的时候&#xff0c;系统会在这里读取信息并挂载到相应目录下。所有的磁盘硬盘SSD挂…

6项目启动

项目启动概述

[Leetcode][第415题][JAVA][字符串相加][双指针]

【问题描述】[简单] 【解答思路】 1. 双指针 从两个字符串最后开始处理 对齐字符串添加当前位 int c abcnt; cnt为进位超过长度的补“0” 要注意最后有可能需要处理溢出位 时间复杂度&#xff1a;O(max(M,N)) 空间复杂度&#xff1a;O(1) public String addStrings(String nu…

401 binary watch

文章题目来源于leetcode&#xff0c;解法学习了讨论去的解法。  问题&#xff1a;有一种二进制LED表。上面的4个LED灯表示小时&#xff0c;下面6个LED灯表示分钟。给定一个int值&#xff0c;写出可能表示的时间。例如输入1&#xff0c; Input: n 1 Return: [“1:00”, “2…

7立项申请

项目诞生的驱动因素 系统服务请求书 识别需求提出项目建议书 项目建议书内容 项目的可行性研究 如何进行项目的可行性研究 市场可行性研究 市场可行性分析注意事项 捕捉用户需求是一件困难的事 三个苹果改变世界 经济可行性 收益与成本 投入产出分析 投资分析期 纯收入 技术可行…

【数据结构与算法】数组与链表

数组的定义和特性 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 线性表&#xff08;Linear List&#xff09;&#xff1a;数组、链表、队列、栈 非线性表&#xff1a;树 图 连续的内存空间和相…

8构建项目组

组建项目组 组建项目组的任务 项目组架构 项目赞助人职责 项目经理的标签 项目经理的责任 项目成员的职责 案例分析 西天取经的只能架构 西天取经项目组 一个良好团队的七个要素

MySQL数据库面试题

目录数据库基础知识为什么要使用数据库什么是SQL&#xff1f;什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式&#xff1f;分别有什么区别&#xff1f;数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引…

log双线性模型log-bilinear model简单概括

LBLM(log-bilinear model)是自然语言处理中的比较简单的模型。LBLM根据上下文的词向量来预测下一个词向量wnw_nwn​&#xff0c;通过对上下文词向量的一个线性组合来表示&#xff1a; rwr_wrw​是一个实数值词向量对于词www对于下一个词的分布计算根据wnw_nwn​预测表示和所有…

9制定项目章程

项目干系人概述 项目主要干系人 项目章程 项目章程的功能 项目章程

【数据结构与算法】栈与队列

栈 一、什么是栈&#xff1f; 1.后进者先出&#xff0c;先进者后出&#xff0c;这就是典型的“栈”结构。 2.从栈的操作特性来看&#xff0c;是一种“操作受限”的线性表&#xff0c;只允许在端插入和删除数据。 二、为什么需要栈&#xff1f; 1.栈是一种操作受限的数据结构…