首页 > 其他分享 >1851. 包含每个查询的最小区间 (Hard)

1851. 包含每个查询的最小区间 (Hard)

时间:2023-07-18 22:55:43浏览次数:34  
标签:idx 1851 Hard 查询 intervals queries 区间 query Query

问题描述

[1851. 包含每个查询的最小区间] (Hard)

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

再给你一个整数数组 queries 。第 j 个查询的答案是满足 leftᵢ <= queries[j] <= rightᵢ长度最 小区间 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 <= 10⁵
  • 1 <= queries.length <= 10⁵
  • intervals[i].length == 2
  • 1 <= leftᵢ <= rightᵢ <= 10⁷
  • 1 <= queries[j] <= 10⁷

解题思路

首先,应该注意到,对 intevals 数组排序对结果不会有任何影响,其次,对 queries 排序也不会对答案产生本质影响,只是改变了答案的顺序罢了,只要把 $query$ 的结果和 $query$ 在原先的 queries 数组的索引对应起来就好了。

为了方便,把 queries 转化为 vector<pair<int, int>> qrs;,first 是要查询的值,second 是这个值在 queries 数组中的索引,然后对 qrs 按 first 从小到大排序。

然后准备遍历 qrs 数组,由于 intervals 已经按照从左端点元素从小到大的顺序排好序了,因此我们比较当前 queryintervals[idx][0] 的大小,如果 intervals[idx][0] <= query,就将 intervals 入队(队中元素满足了题目要求的一半条件),并递增 idx,表示这个区间我们已经考虑了,直到 idx >= queries.size() || intervals[idx][0] > query

接着,我们比较当前 query 与堆顶区间的右端点大小(堆顶是区间长度最小的区间),如果右端点小于 query,将该区间弹出,直到堆为空或者堆顶区间的右端点 >= query

最后,可以更新 query 对应的最小区间长度了。

代码

class Solution {
  public:
    vector<int> minInterval(vector<vector<int>> &intervals, vector<int> &queries) {
        sort(intervals.begin(), intervals.end());
        using pii = pair<int, int>;
        vector<pii> qrs;
        int m = intervals.size(), n = queries.size();
        for (int i = 0; i < n; ++i) {
            qrs.emplace_back(queries[i], i);
        }
        std::sort(qrs.begin(), qrs.end());
        vector<int> ans(n, -1);
        priority_queue<pii, vector<pii>, greater<pii>> pq; // pair.first => right - left + 1,pair.second => right
        int idx = 0;
        for (int i = 0; i < n; ++i) {
            while (idx < m && intervals[idx][0] <= qrs[i].first) {
                pq.push({intervals[idx][1] - intervals[idx][0] + 1, intervals[idx][1]});
                ++idx;
            }
            while (!pq.empty() && pq.top().second < qrs[i].first) {
                pq.pop();
            }
            if (!pq.empty()) {
                ans[qrs[i].second] = pq.top().first;
            }
        }
        return ans;
    }
};

标签:idx,1851,Hard,查询,intervals,queries,区间,query,Query
From: https://www.cnblogs.com/zwyyy456/p/17564359.html

相关文章

  • 1851. Minimum Interval to Include Each Query (Hard)
    Description1851.MinimumIntervaltoIncludeEachQuery(Hard)Youaregivena2Dintegerarrayintervals,whereintervals[i]=[lefti,righti]describestheithintervalstartingatleftiandendingatrighti(inclusive).Thesizeofanintervalisdefi......
  • ORACLE数据库启停、闪回和锁表查询以及创建DBLINK
    数据库启动和停止停止orcale/oracle7//停止1.ps-ef|grepsmon2.exportORACLE_SID=cbsdba(cbsdba是实例名)3.sqlplus/assysdba 4.shutdown immediate;启动1.ps-ef|grepsmon2.exportORACLE_SID=cbsdba3.sqlplus/assysdba 4.startup;5.alter pluggabledatabas......
  • Learning hard C#学习笔记——读书笔记 04
    1.什么是接口接口可以认为是一种规范,它是一种类的构建规范,它里面定义了一系列的方法和类型,但是没有具体的实现,需要继承它的类去自我实现2.接口的定义使用VS2022在解决方案管理器这里,添加新建项在添加新建项模板这里,选择接口最后创建出来的接口如下usingSystem;......
  • [Typescript] 150 Hard - OptionalUndefined
    Implementtheutiltype OptionalUndefined<T,Props> thatturnsallthepropertiesof T thatcanbe undefined,intooptionalproperties.Inaddition,asecond-optional-generic Props canbepassedtorestrictthepropertiesthatcanbealtered.Opti......
  • Learning hard C#学习笔记——读书笔记 05
    1.什么是IL语言我们开篇介绍C#的时候,就介绍了C#的编译过程,C#会通过编译器先编译成IL语言(IntermediateLanguage),IL代码会存放在一个程序集中IL(IntermediateLanguage),它称为CIL或者MSIL,IL是由ECMA组织(也就是定义JS标准的那个组织),提供完整的定义和规范。使用VisualStudio......
  • mysql 使用查询结果update
    MySQL使用查询结果更新的流程在MySQL中,我们可以使用查询结果来更新数据。下面是实现这个过程的步骤表格:步骤描述第一步连接到MySQL数据库第二步编写查询语句第三步执行查询语句第四步获取查询结果第五步编写更新语句第六步执行更新语句下面我......
  • 通过sql查询执行的客户端电脑
    ===========================通过执行sql,找到执行电脑==========================selectsql_text,last_active_time,sql_idfromv$sqlareavawhereva.SQL_TEXTlike'%XX%'orderbylast_active_timedescselectosuser,TERMINAL,MACHINE,PROGRAM,USERNAME,LAST_ACTI......
  • 【python】查询当前日期的所在月的天数
    查询当前日期的所在月的天数#coding:utf-8importdatetimeimportcalendarfromloguruimportloggeraslogsclassca:@staticmethoddefdays_of_the_month():"""查询当前日期的所在月的天数"""#cur_date=datetime.datetime.s......
  • python如何查询一个包是否安装
    如何查询一个包是否安装在使用Python开发项目时,我们经常会使用到第三方库或者模块。但是,在开始使用之前,我们需要确保这些包已经正确地安装在我们的环境中。本文将介绍如何查询一个包是否安装,以及如何解决在使用过程中可能遇到的问题。查询包是否安装首先,我们需要知道如何查询一......
  • 怎样优雅地增删查改(七):按用户查询
    @目录实现使用测试实现定义按用户查询(IUserOrientedFilter)接口publicinterfaceIUserOrientedFilter{publicstringEntityUserIdIdiom{get;}Guid?UserId{get;set;}}EntityUserIdIdiom:语义上的UserId,用于指定业务实体中用于描述“用户Id”字段的名称,......