Python程序:查找包含每个查询的最小区间


假设我们有一个区间列表,其中intervals[i]包含一对(left_i, right_i),表示第i个区间从left_i开始,到right_i结束(均包含)。我们还有一个名为queries的数组。第j个查询的答案是包含queries[j]的最小区间i的大小,即right_i - left_i + 1。如果我们找不到这样的区间,则返回-1。我们必须找到一个包含查询答案的数组。

因此,如果输入类似于intervals = [[2,5],[3,5],[4,7],[5,5]] queries = [3,4,5,6],则输出将为[3, 3, 1, 4],因为查询按以下方式处理:

  • 对于查询= 3:区间[3,5]是最小的包含3的区间。所以,5 - 3 + 1 = 3。

  • 对于查询= 4:区间[3,5]是最小的包含4的区间。所以,5 - 3 + 1 = 3。

  • 对于查询= 5:区间[5,5]是最小的包含5的区间。所以,5 - 5 + 1 = 1。

  • 对于查询= 6:区间[4,7]是最小的包含6的区间。所以,7 - 4 + 1 = 4。

为了解决这个问题,我们将遵循以下步骤:

  • intervals := 将区间列表intervals按降序排序

  • h := 一个新的列表

  • res := 一个新的映射

  • 对于排序后的查询列表中的每个q,执行以下操作:

    • 当intervals不为空且最后一个区间的结束时间小于等于q时,执行以下操作:

      • (i, j) := intervals中的最后一个区间,并将其移除

      • 如果j大于等于q,则

        • 将(j-i+1, j)插入堆h中

    • 当h不为空且h中顶部区间的结束时间小于q时,执行以下操作:

      • 从h中删除顶部元素

    • 如果h不为空,则res[q] := h中顶部区间的起始时间,否则res[q] := -1

  • 返回queries中所有q的res[q]列表

示例

让我们查看以下实现以获得更好的理解

import heapq
def solve(intervals, queries):
   intervals = sorted(intervals)[::-1]
   h = []
   res = {}
   for q in sorted(queries):
      while intervals and intervals[-1][0] <= q:
         i, j = intervals.pop()
         if j >= q:
            heapq.heappush(h, [j - i + 1, j])
      while h and h[0][1] < q:
         heapq.heappop(h)
      res[q] = h[0][0] if h else -1
   return [res[q] for q in queries]

intervals = [[2,5],[3,5],[4,7],[5,5]]
queries = [3,4,5,6]
print(solve(intervals, queries))

输入

[[2,5],[3,5],[4,7],[5,5]], [3,4,5,6]

输出

[3, 3, 1, 4]

更新于: 2021年10月8日

301 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告