给你一个二维整数数组 intervals
,其中 intervals[i] = [lefti, righti]
表示第 i
个区间开始于 lefti
、结束于 righti
(包含两侧取值,闭区间)。区间的 长度 定义为区间中包含的整数数目,更正式地表达是 righti - lefti + 1
。
再给你一个整数数组 queries
。第 j
个查询的答案是满足 lefti <= queries[j] <= righti
的 长度最小区间 i
的长度 。如果不存在这样的区间,那么答案是 -1
。
以数组形式返回对应查询的所有答案。
示例 1:
```txt
输入: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:
```txt
输入: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^5
1 <= queries.length <= 10^5
queries[i].length == 2
1 <= lefti <= righti <= 10^7
1 <= queries[j] <= 10^7
包含每个查询的最小区间
题目
给你一个二维整数数组 intervals
,其中 intervals[i] = [lefti, righti]
表示第 i
个区间开始于 lefti
、结束于 righti
(包含两侧取值,闭区间)。区间的 长度 定义为区间中包含的整数数目,更正式地表达是 righti - lefti + 1
。
再给你一个整数数组 queries
。第 j
个查询的答案是满足 lefti <= queries[j] <= righti
的 长度最小区间 i
的长度 。如果不存在这样的区间,那么答案是 -1
。
以数组形式返回对应查询的所有答案。
示例 1:
1 | 输入:intervals = [[1,4],[2,4],[3,6],[4,4]], queries = [2,3,4,5] |
示例 2:
1 | 输入:intervals = [[2,3],[2,5],[1,8],[20,25]], queries = [2,19,5,22] |
提示:
-
1 <= intervals.length <= 10^5
-
1 <= queries.length <= 10^5
-
queries[i].length == 2
-
1 <= lefti <= righti <= 10^7
1 <= queries[j] <= 10^7
题解
方法一:
思路
直接离散化所有出现过的值,不超过3e5个。
区间修改,单点求最小值
线段树模板题,直接使用线段树维护即可。
代码
1 | class Solution { |
方法二:
思路
动态开点,不用离散化
区间修改,单点查询
代码
1 | class Solution { |
方法三:
思路
离线操作,对查询升序排序。
对所有区间左端点升序排序
对于查询位置i,将左端点比i小的区间加入到优先队列中,优先队列优先以区间长度小的排前面。
所以查询点i所处最小区间长度,可以通过优先队列队首得到。
但是由于有失效的区间(队列中右端点小于i的区间)存在,可以采用延迟删除的技巧——不断删除队首右端点小于i的区间。
这样做保证了时间复杂度仍然是$O(nlogn)$,因为每个区间只会进队和出队一次,进队出队时间复杂度$O(logn)$
代码
1 | class Solution { |