学习笔记:小C的 MEX 查询问题
问题描述
小C拿到了一个空集合,她需要进行若干次操作:每次将区间 [l, r] 的每个整数添加到集合中,然后输出当前集合的 MEX。MEX(Minimum EXcluded Number)定义为集合中 最小的未出现的非负整数。
例如,给定输入 q = 4, queries = [[1, 3], [7, 8], [0, 5], [3, 6]],需要在每次区间添加后输出集合的 MEX 值。
思路分析
这个问题的关键在于如何有效地维护集合中的数值,并且在每次添加操作后快速计算出 MEX 值。我们可以使用一个集合来动态存储所有的数值,同时通过逐步增加 MEX 来找到集合中未出现的最小非负整数。
-
集合的维护:
- 使用 Python 的
set数据结构来存储所有加入的数值,这样可以方便地进行查找和插入操作。
- 使用 Python 的
-
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]
代码解析
-
初始化集合与 MEX 变量:
- 使用
added_numbers集合来存储加入的所有数字。 - 使用
current_mex变量来追踪当前集合的 MEX 值。
- 使用
-
遍历每个查询区间:
- 对于每个查询区间
[l, r],将区间内的所有整数加入added_numbers集合。 - 然后更新
current_mex,通过逐步增加current_mex的值,直到找到不在added_numbers集合中的最小非负整数。
- 对于每个查询区间
-
存储与返回结果:
- 在每次查询后,将
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 问题的解决方法!