LeetCode | 1851.包含每个查询的最小区间

news2024/12/31 6:09:51

LeetCode | 1851.包含每个查询的最小区间

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

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

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

示例 1:

输入:intervals = [[1,4],[2,4],[3,6],[4,4]], queries = [2,3,4,5]
输出:[3,3,1,4]
解释:查询处理如下:
- Query = 2 :区间 [2,4] 是包含 2 的最小区间,答案为 4 - 2 + 1 = 3 。
- Query = 3 :区间 [2,4] 是包含 3 的最小区间,答案为 4 - 2 + 1 = 3 。
- Query = 4 :区间 [4,4] 是包含 4 的最小区间,答案为 4 - 4 + 1 = 1 。
- Query = 5 :区间 [3,6] 是包含 5 的最小区间,答案为 6 - 3 + 1 = 4 。

示例 2:

输入:intervals = [[2,3],[2,5],[1,8],[20,25]], queries = [2,19,5,22]
输出:[2,-1,4,6]
解释:查询处理如下:
- Query = 2 :区间 [2,3] 是包含 2 的最小区间,答案为 3 - 2 + 1 = 2 。
- Query = 19:不存在包含 19 的区间,答案为 -1 。
- Query = 5 :区间 [2,5] 是包含 5 的最小区间,答案为 5 - 2 + 1 = 4 。
- Query = 22:区间 [20,25] 是包含 22 的最小区间,答案为 25 - 20 + 1 = 6 。

提示:

  • 1 <= intervals.length <= 105
  • 1 <= queries.length <= 105
  • queries[i].length == 2
  • 1 <= lefti <= righti <= 107
  • 1 <= queries[j] <= 107

思路:扫描线加优先队列,和 LeetCode | 218. 天际线问题 类似。

把 intervals[i] 的左右两个边界当成是矩形的两条竖边的 x 坐标,矩形的高度为 righti - lefti + 1; queries[j] 就是扫描线,查询的结果就是 queries[j] 所在位置的高度最低的矩形,如果没有矩形,返回 -1。

例:第一题的图
img
当扫描线为 2 时,最低的矩形是 3;扫面线为 4 时,最低的矩形是 1(因为区间为[4, 4], 所以只能看见一根红色的线)。

实现一:把要查询的区间和扫描线放到同一个数据结构中保存,从左往右遍历

struct Event {
    int type;
    int pos;
    int para;
    
    Event(int _type, int _pos, int para): type(_type), pos(_pos), para(para) {}

    bool operator< (const Event& that) const {
        return pos < that.pos || (pos == that.pos && type < that.type);
    }
};

vector<int> minInterval(vector<vector<int>>& intervals, vector<int>& queries) {
    int n = intervals.size();
    int m = queries.size();
    
    vector<Event> events;
    for (int i = 0; i < m; ++i) {
        events.emplace_back(1, queries[i], i);
    }
    for (const auto& interval: intervals) {
        events.emplace_back(0, interval[0], interval[1]);
        events.emplace_back(2, interval[1], interval[0]);
    }

    sort(events.begin(), events.end());

    vector<int> ans(m, -1);
    multiset<int> seg;
    for (const auto& event: events) {
        if (event.type == 0) {
            seg.insert(event.para - event.pos + 1);
        } else if (event.type == 1) {
            if (!seg.empty()) {
                ans[event.para] = *seg.begin();
            }
        } else {
            int len = event.pos - event.para + 1;
            auto it = seg.find(len);
            seg.erase(it);
        }
    }
    return ans;
}

实现二: 用优先队列保存扫描线所在的区间,扫描线不在区间时,区间移出队列。

vector<int> minInterval(vector<vector<int>>& intervals, vector<int>& queries) {
    vector<int> queries_B = queries, res;
    sort(intervals.begin(), intervals.end());
    sort(queries_B.begin(), queries_B.end());

    auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) -> bool { return a.first > b.first; };
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> que(cmp);

    int n = intervals.size(), idx = 0;
    map<int, int> tmp;
    for (int it : queries_B) {
        while (idx < n && intervals[idx][0] <= it) {
            que.emplace(intervals[idx][1] - intervals[idx][0] + 1, intervals[idx][1]);
            idx++;
        }
        while (!que.empty() && que.top().second < it) {
            que.pop();
        }
        tmp[it] = que.empty() ? -1 : que.top().first;
    }
    
    for (int it : queries) {
        res.push_back(tmp[it]);
    }
    return res;
}

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

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

相关文章

基于java+ssm+shiro的出租房管理平台

✌博主介绍✌:一个致力于全战开发的代码热爱者 龙门客栈管理平台一、前言介绍&#xff1a;二、系统设计&#xff1a;2.1 系统整体架构&#xff1a;2.1.1 数据库表结构的介绍&#xff1a;2.1.2 系统功能设计&#xff1a;三、功能截图&#xff1a;3.1 登录注册&#xff1a;3.2 基…

使用react-grid-layout和echarts-for-react实现一个支持拖拽的自定义响应式dashboard页面

使用react-grid-layout和echarts-for-react实现一个支持拖拽的自定义响应式dashboard页面 需求概要 在前端工作中&#xff0c;我们会经常遇到自定义dashboard页这样的需求。然后我想做一个能够让用户可以在面板上自由的拖拽&#xff0c;固定&#xff08;不允许拖拽&#xff0…

游戏源码编程软件,对于新手来说十分友好,纯中文的界面让所有功能都一目了然,操作相当简单

这是一款免费的图像化编程工具,使用者无需会任何编程语言即可通过拼接积木的形式搭建出属于自己的程序。 编程猫kitten使用教程: 1、打开软件,进入软件主界面,运行界面如下图。 2、点击文件,可选择打开、新建、打开本地作品等。 3、可在方框内输入作品名称,快速进行输入…

安静!听听AI眼中岛国老师的声音~

大家好&#xff0c;我是鸟哥。一个半路出家的程序员。 最近在折腾自己的微信机器人&#xff0c;除了自动回复&#xff0c;自动拉群等常规的功能外&#xff0c;我准备给它赋予一些AI功能&#xff0c;毕竟这两年人工智能火的一塌糊涂。例如前段时间风靡朋友圈的人物头像动漫化&am…

如何保存/同步多架构容器 Docker 镜像

前言 随着容器、芯片技术的进一步发展&#xff0c;以及绿色、节能、信创等方面的要求&#xff0c;多 CPU 架构的场景越来越常见。典型的应用场景包括&#xff1a; 信创&#xff1a;x86 服务器 鲲鹏 ARM 等信创服务器&#xff1b;个人电脑&#xff1a;苹果 Mac M1 Windows 电…

Triton Inference Server 环境配置

本人环境 Ubuntu18.04&#xff0c;3090显卡&#xff0c;显卡驱动版本510.85.02&#xff0c;cuda版本11.6&#xff0c;docker版本20.10.12(注意&#xff1a;docker一定要通过apt安装&#xff0c;用snap安装会报错) 安装步骤 1. 根据驱动版本和cuda版本下载对应版本的Triton D…

java计算机毕业设计ssm驾校预约考试管理系统a3cf7(附源码、数据库)

java计算机毕业设计ssm驾校预约考试管理系统a3cf7&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

第四章. Pandas进阶—日期数据处理

第四章. Pandas进阶 4.7 日期数据处理 1.DataFrame的日期数据转换&#xff08;to_datetime&#xff09; 在日常工作中&#xff0c;常见的日期方式有很多种&#xff0c;例如’20221123’&#xff0c;‘2022.11.23’&#xff0c;‘2022/11/23’&#xff0c;‘23/11/2022’&#…

Deepwalk详解

算法思想 源于word2vec &#xff0c;word2vec通过语料库中的句子序列来描述词与词之间的共现关系。进而学习到词语的向量表示&#xff0c;deepwalk则使用图中的节点与节点的共像现关系来学习节点的向量表示。这种借鉴的前提是点在图中的分布和词在句子中的分布都是幂律分布。 …

关于MuLoginWebGL介绍说明:

WebGL就是俗称的硬件显卡型号的意思&#xff0c;在MuLogin中我们提供了多个平台和品牌的显卡芯片指纹。 我们在做实验时&#xff0c;Chrome浏览器和Internet Explorer&#xff08;Edge&#xff09;测试取WebGL vendor 会有两种不同值 &#xff0c;Chrome 取为 Google Inc. Int…

2023年湖北监理工程师考试科目有哪些?考试题型什么样子的?

2023年湖北监理工程师考试科目有哪些&#xff1f;考试题型什么样子的&#xff1f; 一、监理工程师考试科目&#xff1a; 监理工程师考试一共考四科 1. 《建设工程监理基本理论和相关法规》(客观题) 2. 《建设工程合同管理》(客观题) 3. 《建设工程目标控制》(客观题) 4. 《…

社交电商时代,切勿剑走偏锋,始终以产品为中心,模式为辅助

社交电商这个名词近期十分火&#xff0c;参与这个方式的人数以亿计&#xff0c;可以这样说“十亿人民九亿商&#xff0c;八亿人在做电商”。 我们感悟&#xff1a;“传统电商火热&#xff0c;社交电商更火”&#xff01;那么什么是社交电商呢&#xff1f;社交电商概念&#xff…

必须了解的海外新闻稿写作要点 ️

随着经济全球化的发展&#xff0c;中国企业走向世界是必然的趋势。媒介易小编发现了全球的海外消费者一般了解一个品牌都是去搜索引擎搜索&#xff0c;所以确认海外媒体投放新闻稿是中国企业走向世界必经之路&#xff0c;是密不可分的哟。 新闻稿是公司或机构向媒体发送的手稿。…

Python学习基础笔记十四——函数参数

函数参数这块在前面的博客中没有展开&#xff0c;现在专门整理出来&#xff1a; 1、参数的数量&#xff1a; 1&#xff09;没有参数&#xff1a;就是定义函数和调用函数的括号中都不写内容。 2&#xff09;有一个参数&#xff1a;可以是任何数据类型。 3&#xff09;有多个参…

学习python中的数据结构

数据结构 链表和数组 数组 Python的list是由数组来实现的 有序的元素序列, 在内存中表现为一块连续的内存区域; 链表 通过指针将无序的列表链接起来, 每个节点都存储着当前节点的值和下一个节点的内存地址 链表和数组有什么区别? 实现有序的方式是不一样的, 数组是连续的内…

[附源码]SSM计算机毕业设计网上鞋店管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Pan-cancer image-based detection of clinically actionable genetic alternations

目录 摘要 前言 结果 深度学习模型优化 从组织病理图像预测泛癌基因突变 摘要 肿瘤的分子突变可导致肿瘤细胞及其微环境的表型变化。常规组织病理切片可以反映出这种形态学改变。本研究表明深度学习方法能直接从常规病理图像中推断出广泛的基因突变、肿瘤分子亚型、基因表达…

中纺集团×StarRocks:构建企业级数据资产管理的实践

中纺集团经过“十三五”信息化建设&#xff0c;生成了大量宝贵的数据资源&#xff0c;但也存在信息孤岛、系统壁垒、数据质量等问题。中纺结合企业实际需求&#xff0c;按照集团“十四五”信息化规划中有关数据中台的建设计划与目标要求&#xff0c;历经半年多的测试比选&#…

使用扩展有效对齐 SwiftUI 内容,创建自定义 SwiftUI 方法以快速对齐项目并使您的代码看起来简洁明了(教程含源码)

在开发 iOS 应用程序时,对齐内容可能是一个耗时的过程。如果应用程序有多个屏幕,则需要在不同的地方完成这件事,并可能导致看起来杂乱无章的视图。 作为一个始终致力于让我的代码看起来简单和流线型的人,实现目标所需的大量Spacer()元素常常让我恼火,这就是为什么当我发…

配置Nginx和其他应用的HTTPS访问

使用tomcat或者weblogic部署的应用默认都是http访问的&#xff0c;如果通过https访问&#xff0c;需要ssl证书。tomcat或者weblogic可以配置&#xff1b; 同时&#xff0c;另一种方法&#xff0c;https网站中&#xff0c;如果接口服务是http的&#xff0c;那么请求接口就会被拒…