Featured image of post 1851. 包含每个查询的最小区间

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
  • intervals[i].length == 2
  • 1 <= lefti <= righti <= 107
  • 1 <= queries[j] <= 107

解法一:优先队列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
type PriorityQueue struct {
    arr [][3]int
}

func (pq *PriorityQueue) Len() int {
    return len(pq.arr)
}

func (pq *PriorityQueue) Less(i, j int) bool {
    return pq.arr[i][0] < pq.arr[j][0]
}

func (pq *PriorityQueue) Push(x interface{}) {
    pq.arr = append(pq.arr, x.([3]int))
}

func (pq *PriorityQueue) Pop() interface{} {
    a := pq.arr
    ret := a[len(a)-1]
    pq.arr = a[:len(a)-1]
    return ret
}

func (pq *PriorityQueue) Swap(i, j int) {
    pq.arr[i], pq.arr[j] = pq.arr[j], pq.arr[i]
}

func minInterval(intervals [][]int, queries []int) []int {
    h, k := len(intervals), len(queries)
    qIdxs, ans := make([]int, k), make([]int, k)
    for i := 0; i < k; i++ {
        qIdxs[i] = i
        ans[i] = -1
    }
    sort.Slice(qIdxs, func(i, j int) bool {
        return queries[qIdxs[i]] < queries[qIdxs[j]]
    })
    sort.Slice(intervals, func(i, j int) bool {
        return intervals[i][0] < intervals[j][0]
    })

    next := 0
    pq := &PriorityQueue{}
    for _, qi := range qIdxs {
        for next < h && queries[qi] >= intervals[next][0] {
            l := intervals[next][1] - intervals[next][0] + 1
            heap.Push(pq, [3]int{l, intervals[next][0], intervals[next][1]})
            next++
        }
        for pq.Len() > 0 && pq.arr[0][2] < queries[qi] {
            heap.Pop(pq)
        }
        if pq.Len() > 0 {
            ans[qi] = pq.arr[0][0]
        }
    }
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/18 13:00:21
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计