一天一大 leet(最小区间)难度:困难-Day20200801
时间:2022-07-25
本文章向大家介绍一天一大 leet(最小区间)难度:困难-Day20200801,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。
我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。
示例:
输入:[[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] 中。
注意:
- 给定的列表可能包含重复元素,所以在这里升序表示 >= 。
- 1 <= k <= 3500
- -105 <= 元素的值 <= 105
抛砖引玉
img
思路
刚看本题确实没有什么思路,看了官方的题解先去完成了最小覆盖子串:
more-011: 最小覆盖子串 (难度:困难)
再回看思路就比较明显了:
- 把nums矩阵合并成一个有序数组,且记录每一个元素来源的行数
- 最终求覆盖所有行数的数字区间
逻辑
- 即要记录value又要记录行数,数组(二维){index:行数,value:值}
- 新排序数组dp
- left,right新数组指针
- map记录待匹配的行索引即每行数量
- Rleft,Rright终止区间
/**
* @param {number[][]} nums
* @return {number[]}
*/
var smallestRange = function(nums) {
let dp = [],
map = new Map(),
left = 0,
right = 0,
Rleft = -Number.MAX_VALUE, // 结果区间的left索引
Rright = -1, // 结果区间的right索引
type = 0; // 区间中数字来源的行数种类
// 生成二维映射数组dp 行映射map
for (let i = 0; i < nums.length; i++) {
map.set(i, 0);
for (let j = 0; j < nums[i].length; j++) {
dp.push({ index: i, value: nums[i][j] })
}
}
// dp排序
dp.sort((a, b) => a.value - b.value);
// 右边界
while (right < dp.length) {
let Rindex = dp[right].index, // 指针所在的数字来源行
Rvalue = dp[right].value, // 指针所在的数字
RMvalue = map.get(Rindex) // 区间内改行数字数量
// 区间新增 来源于新行 则行类型+1
if (RMvalue === 0) ++type
// 记录对应新增数字个数
map.set(Rindex, ++RMvalue)
// 来源行包含所有行即等于map-size
while (type === map.size && left <= right) {
let Lindex = dp[left].index,
Lvalue = dp[left].value,
LMvalue = map.get(Lindex);
// 如果新的区间比较小则使用新区间
if (Rvalue - Lvalue < Rright - Rleft) {
Rleft = Lvalue
Rright = Rvalue
}
// 丢弃一个数字,map记录减一
map.set(Lindex, --LMvalue)
// 丢失数字的计算为0,则说明该来源行在区间中无数字,减少行计数
if (LMvalue === 0) --type
// 做区间向右移动
left++
}
// 右区间向右移动
right++
}
return [Rleft, Rright]
};
- 一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)
- 一个SQL语句引发的ORA-00600错误排查(二)(r9笔记第65天)
- 关于all_procedures的问题分析 (r9笔记第61天)
- 半自动化搭建Data Guard的想法和实践(一) (r9笔记第74天)
- Go语言位操作实例
- 通过Snapshot Standby来精确评估SQL性能 (r9笔记第73天)
- mongodb11天之屠龙宝刀(三)基本操作:增删改查与mysql对比
- Go语言 实现bitmap
- 最近的几个技术问题总结和答疑(八) (r9笔记第72天)
- Java基础-day05-代码题
- MySQL级联复制的同步问题(一) (r9笔记第71天)
- GO语言 TCP传输实例
- JavaScript 性能优化技巧分享
- 一个拷贝操作导致的潜在监听类问题(r9笔记第70天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈优化Django ORM中的性能问题
- PHP chr()函数讲解
- iOS音视频接入 - TRTC常见问题
- PHP常见的几种攻击方式实例小结
- PHP strripos函数用法总结
- Laravel5.0+框架邮件发送功能实现方法图文与实例详解
- Ajax+PHP实现的删除数据功能示例
- tensorflow下的图片标准化函数per_image_standardization用法
- 浅析Python面向对象编程
- Python单元测试及unittest框架用法实例解析
- Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
- YII框架实现自定义第三方扩展操作示例
- 在Tensorflow中实现leakyRelu操作详解(高效)
- Django def clean()函数对表单中的数据进行验证操作
- Python3爬虫中Splash的知识总结