LeetCode Weekly Contest 239的详解分享

Hard- 1851. Minimum Interval to Include Each Query

题意:给定一个二维阵列表示区间[left, right]\(表示left, right两个数字),区间的长度定义为right - left + 1
另给定一个阵列表示query,要回答每个query包含该数字的最小长度为何?
Sample Input:intervals = [[1,4],[2,4],[3,6],[4,4]], queries = [2,3,4,5]
Output: [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.

本题需要事先将queries和intervals排序,
每次进来一个新的query时,将旧的元素踢除(区间右界小於现在的query),
尝试加入新的可能元素(区间左界小於现在的query),
由於需要一直新增、移除元素,
还要查询最小值,故想到用「heap」结构

# 1851. Minimum Interval to Include Each Query 题解
from heapq import heappop, heappush
class Solution:
    def minInterval(self, intervals: List[List[int]], queries: List[int]) -> List[int]:
        A = sorted(intervals)
        Q = sorted((q, i) for i, q in enumerate(queries))
        heap = []
        res = [-1] * len(Q)
        j = 0
        
        for query, idx in Q:
            while heap and heap[0][1] < query:
                heappop(heap)
            while j < len(A) :
                left, right = A[j]
                if left>query:
                    break
                if right>=query:
                    heappush(heap, (right - left + 1, right))
                j+=1
            if heap:
                res[idx] = heap[0][0]
        return res

<<:  {CMoney战斗营} 的第十周 #摇身一变的游戏风格

>>:  [Day 48] 留言板後台及前台(四) - 处理留言板内容

#19-我的台北直直落! 文字影片+滚动视差

有一阵子滑网页案例时,超常看到用SVG配上滚动视差(Parallax) 今天终於要来试试看了! 滚动...

Day-28 了解 Namespace 与 Rbac

前言 介绍Kubernetes到现在我们都还没提及到Kubernetes cluster是如何去区分...

【在 iOS 开发路上的大小事-Day02】抛弃 Storyboard 改用 Xib 来做全部的 UI 设计吧

前情提要 一般在用 Xcode 创新专案的时候,会预设使用 Main.storyboard 来作为我...

# Day21--Git标准姿势?基本动作?

在接下来几篇的文章中,大概会提到所谓的Git,後来听许多前辈说,Git是工程师非常加分的条件,虽然自...

Rails基本介绍(二)

听音乐先~ Rails操作实体 接续前一篇文章,做出一个实体後。 专案中 project_name/...