【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆

简介: 【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆

包含每个查询的最小区间【LC1851】

给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti(包含两侧取值,闭区间)。区间的 长度 定义为区间中包含的整数数目,更正式地表达是 righti - lefti + 1

再给你一个整数数组 queries 。第 j 个查询的答案是满足 lefti <= queries[j] <= righti长度最小区间 i 的长度 。如果不存在这样的区间,那么答案是 -1

以数组形式返回对应查询的所有答案。

排序+离线查询+小顶堆

  • 思路
  • 我们需要找到包含 queries[j]的区间的最小长度,而查询的顺序不会影响结果,因此可以采用离线查询的思路,按照某种顺序处理每个查询,以便于不需要重复访问区间,减少时间复杂度

什么顺序?

  • 按照 queries[j]从小到大的顺序处理查询,为了找到所有包含 queries[j]的区间,因此需要对所有区间按照左端点从小到大的顺序进行排序
  • 使用小顶堆存放区间信息,小顶堆以区间长度从小到大排序。
  • 对于每个查询,将可能包含该值的所有区间入堆,即如果该区间左端点小于等于queries[j],那么将其放入小顶堆中
  • 怎么获得最小区间长度?
    将所有可能区间放入后,进行判断:
  • 如果堆顶元素右端点小于queries[j],那么该区间不包含queries[j],将其弹出
  • 如果堆不为空,那么堆顶元素即为查询结果;否则,不存在合法区间,答案为-1
  • 实现
class Solution {
    public int[] minInterval(int[][] intervals, int[] queries) {
        int n = intervals.length, m = queries.length;
        int[] res = new int[m];       
        int[][] q = new int[m][2];
        for (int i = 0; i < m; i++){
            q[i][0] = queries[i];
            q[i][1] = i;
        }
        Arrays.sort(q, (o1, o2) -> o1[0] - o2[0]);// 对查询从小到大排序
        Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);// 对intervals左端点从小到大排序
        int i = 0;
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[2] - o2[2]);// 小顶堆,按照区间长度从小到大排序
        for (int j = 0; j < m; j++){
            int val = q[j][0], index = q[j][1];
            while (i < n && intervals[i][0] <= val){
                pq.add(new int[]{intervals[i][0], intervals[i][1], intervals[i][1] - intervals[i][0] + 1});// 将可能包含该值的所有区间入堆
                i++;
            }
            while (!pq.isEmpty() && pq.peek()[1] < val){
                pq.poll();// 将不包含该值的所有区间入堆
            }
            if (pq.isEmpty()){
                res[index] = -1;
            }else{
                res[index] = pq.peek()[2];
            }
        }
        return res;
    }
}

image.png

目录
相关文章
|
机器学习/深度学习 资源调度 算法
【机器学习基础】多元线性回归(适合初学者的保姆级文章)
【机器学习基础】多元线性回归(适合初学者的保姆级文章)
821 0
|
机器学习/深度学习 存储 数据采集
数据分析案例-基于多元线性回归算法预测学生期末成绩
数据分析案例-基于多元线性回归算法预测学生期末成绩
1878 0
数据分析案例-基于多元线性回归算法预测学生期末成绩
|
存储 前端开发 JavaScript
前端实现俄罗斯方块游戏(内含源码)
前端实现俄罗斯方块游戏(内含源码)
587 2
|
存储 资源调度 安全
供应商的落地案例和信创
供应商的落地案例和信创
491 0
|
存储 Kubernetes Cloud Native
【阿里云云原生专栏】云原生容器存储:阿里云CSI与EBS的高效配合策略
【5月更文挑战第29天】阿里云提供云原生容器存储接口(CSI)和弹性块存储(EBS)解决方案,以应对云原生环境中的数据存储挑战。CSI作为Kubernetes的标准接口简化存储管理,而EBS则提供高性能、高可靠性的块存储服务。二者协同实现动态供应、弹性伸缩及数据备份恢复。示例代码展示了在Kubernetes中使用CSI和EBS创建存储卷的过程。
512 3
|
消息中间件 存储 JSON
RocketMQ 消费进度持久化
本文介绍了RocketMQ中消费进度的持久化机制,包括普通消息和延迟消息的消费偏移量是如何存储的。普通消息的消费进度存储于`consumerOffset.json`文件,格式为`{Topic}@{ConsumerGroup}`,而延迟消息则存储于`delayOffset.json`文件,以`{delayLevel:offset}`的形式记录。文章详细分析了相关文件内容及代码实现,并指出Broker分别以5秒和10秒的间隔进行持久化操作。
260 6
|
编解码 Linux 开发工具
如何启动Windows平台轻量级RTSP服务生成RTSP拉流URL
为满足内网超低延迟需求,我们开发了轻量级RTSP服务模块,避免用户额外部署服务器。此模块集成于推送端SDK中,支持Windows、Linux、Android及iOS平台,可将本地音视频数据编码后通过RTSP协议提供。具备RTSP鉴权、单播/组播等功能,支持H.264/H.265编码,同时可创建多个服务实例,并查询连接数。实测总延迟约200-300毫秒,兼具稳定与高效。
309 1
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【7月更文挑战第22天】在大数据领域,Python算法效率至关重要。本文深入解析时间与空间复杂度,用大O表示法衡量执行时间和存储需求。通过冒泡排序(O(n^2)时间,O(1)空间)与快速排序(平均O(n log n)时间,O(log n)空间)实例,展示Python代码实现与复杂度分析。策略包括算法适配、分治法应用及空间换取时间优化。掌握这些,可提升大数据处理能力,持续学习实践是关键。
308 1
|
前端开发 Shell 容器
前端练习小项目——视觉冲击卡片
前端练习小项目——视觉冲击卡片