小C的 MEX 查询问题//豆包MarsCode AI刷题

138 阅读3分钟

学习笔记:小C的 MEX 查询问题

问题描述

小C拿到了一个空集合,她需要进行若干次操作:每次将区间 [l, r] 的每个整数添加到集合中,然后输出当前集合的 MEX。MEX(Minimum EXcluded Number)定义为集合中 最小的未出现的非负整数

例如,给定输入 q = 4, queries = [[1, 3], [7, 8], [0, 5], [3, 6]],需要在每次区间添加后输出集合的 MEX 值。

思路分析

这个问题的关键在于如何有效地维护集合中的数值,并且在每次添加操作后快速计算出 MEX 值。我们可以使用一个集合来动态存储所有的数值,同时通过逐步增加 MEX 来找到集合中未出现的最小非负整数。

  1. 集合的维护

    • 使用 Python 的 set 数据结构来存储所有加入的数值,这样可以方便地进行查找和插入操作。
  2. MEX 值的计算

    • 通过一个变量 current_mex 来维护当前的 MEX 值。从 0 开始,逐步增加,直到找到集合中不存在的数为止,这就是当前的 MEX。

代码实现

下面是这个问题的解决方案:

def solution(q, queries):
    added_numbers = set()  # 存储加入集合的数字
    current_mex = 0        # 初始 MEX 值为 0
    results = []           # 存储每次查询后的 MEX 值

    for l, r in queries:
        # 将区间 [l, r] 的所有整数加入集合
        for num in range(l, r + 1):
            added_numbers.add(num)

        # 更新 current_mex,直到找到第一个不在集合中的非负整数
        while current_mex in added_numbers:
            current_mex += 1

        # 记录当前的 MEX
        results.append(current_mex)

    return results

# 示例测试
print(solution(4, [[1, 3], [7, 8], [0, 5], [3, 6]]))  # 输出: [0, 0, 6, 9]
print(solution(3, [[0, 2], [3, 4], [6, 10]]))         # 输出: [3, 5, 5]
print(solution(2, [[2, 5], [7, 9]]))                  # 输出: [0, 0]

代码解析

  1. 初始化集合与 MEX 变量

    • 使用 added_numbers 集合来存储加入的所有数字。
    • 使用 current_mex 变量来追踪当前集合的 MEX 值。
  2. 遍历每个查询区间

    • 对于每个查询区间 [l, r],将区间内的所有整数加入 added_numbers 集合。
    • 然后更新 current_mex,通过逐步增加 current_mex 的值,直到找到不在 added_numbers 集合中的最小非负整数。
  3. 存储与返回结果

    • 在每次查询后,将 current_mex 添加到结果列表中。
    • 最后返回 results 列表。

示例分析

示例 1:
  • 输入:q = 4, queries = [[1, 3], [7, 8], [0, 5], [3, 6]]

  • 输出:[0, 0, 6, 9]

    • 第一次操作:加入 [1, 3]MEX = 0
    • 第二次操作:加入 [7, 8]MEX = 0
    • 第三次操作:加入 [0, 5]MEX = 6
    • 第四次操作:加入 [3, 6]MEX = 9
示例 2:
  • 输入:q = 3, queries = [[0, 2], [3, 4], [6, 10]]

  • 输出:[3, 5, 5]

    • 第一次操作:加入 [0, 2]MEX = 3
    • 第二次操作:加入 [3, 4]MEX = 5
    • 第三次操作:加入 [6, 10]MEX = 5

时间复杂度

  • 时间复杂度

    • 每次查询都需要遍历区间 [l, r],时间复杂度为 O(r - l + 1)。
    • 更新 MEX 的操作在最坏情况下可能是 O(n),其中 n 是集合中元素的数量。
    • 因此,总的时间复杂度为 O(q * n),对于较大的输入,可能会变得比较慢。

小结

这个问题的解法通过使用集合和维护一个 current_mex 值来动态计算 MEX。虽然暴力解法可以解决这个问题,但在数据量较大的情况下,性能可能会有所不足。为了优化,可以考虑使用更高效的数据结构,例如 平衡树 或其他类似的数据结构,以便更快地查找 MEX 值。

通过这道题,我们学习到了如何动态维护集合数据,并高效地计算集合的最小未出现的非负整数。这类问题在处理动态数据结构和最小值查找时有着广泛的应用。希望这篇笔记能帮助你更好地理解 MEX 问题的解决方法!