当前位置:实例文章 » JAVA Web实例» [文章]【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆

【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆

发布人:shili8 发布时间:2025-01-15 13:38 阅读次数:0

**每日一题 Day269**

**包含每个查询的最小区间**

今天,我们来解决一个有趣的问题:给定一个整数数组 `nums` 和一个二维数组 `queries`,其中 `queries[i] = [starti, endi]` 表示从 `starti` 到 `endi` 的区间。我们需要找到包含每个查询的最小区间。

**示例1**

输入:`nums = [4,5,6,7,8]`, `queries = [[2,4],[0,4],[1,3]]`

输出:`[[4,7],[0,7],[1,6]]`

**示例2**

输入:`nums = [4,5,6,7,8]`, `queries = [[1,3],[0,2]]`

输出:`[[5,6],[4,6]]`

**解决方案**

我们可以使用一个小顶堆来解决这个问题。具体来说,我们会维护一个小顶堆,包含所有可能的最小区间。

首先,我们需要将 `nums` 中的每个数字都放入小顶堆中。这样做的目的是确保小顶堆中的每个元素都是当前最小的区间。

接下来,我们遍历 `queries` 中的每个查询。对于每个查询,我们会从小顶堆中取出一个元素,并将其与当前的最小区间进行比较。如果新的元素是更小的,则我们更新最小区间并将新元素放回小顶堆。

最后,我们返回所有最小区间的集合。

**代码实现**

import heapqclass Solution:
 def minInterval(self, nums: List[int], queries: List[List[int]]) -> List[List[int]]:
 # 将 nums 中的每个数字都放入小顶堆中 heap = []
 for num in nums:
 heapq.heappush(heap, (num, num))

 # 初始化最小区间和答案列表 min_interval = float('inf')
 ans = []

 # 遍历 queries 中的每个查询 for start, end in queries:
 while heap and heap[0][1] <= end:
 _, val = heapq.heappop(heap)
 min_interval = min(min_interval, val)

 # 如果最小区间是当前最小的,则更新答案列表 if min_interval < float('inf'):
 ans.append([min_interval, max(nums)])

 return ans


**时间复杂度**

时间复杂度为 O(n log n),其中 n 是 `nums` 中数字的数量。

**空间复杂度**

空间复杂度为 O(n),其中 n 是 `nums` 中数字的数量。

以上就是本题的解决方案。希望通过这个例子,你可以更好地理解如何使用小顶堆来解决类似的问题。

其他信息

其他资源

Top