📅  最后修改于: 2023-12-03 14:58:17.195000             🧑  作者: Mango
MEX是一种操作,表示对于一个集合S和一个非负整数k,所有小于k的非负整数中最小不在S中的数。通俗地说,就是找到从0开始第一个不在S中的非负整数。
给定一个长度为N的整数数组A和一个正整数K,求A的所有长度为K的子数组的最小MEX。
输入:
A = [1, 3, 4, 2, 5, 6], K = 3
输出:
1
解释:A的所有长度为3的子数组为[1, 3, 4], [3, 4, 2], [4, 2, 5], [2, 5, 6],它们的MEX分别为0, 1, 3, 2,故最小MEX为1。
若K > N,则不存在长度为K的子数组,返回0即可。
对于长度为K的子数组,存在K-2个长度为K-1的子数组,因此可以先遍历A,对于每个A[i],找到以A[i]为结尾的长度为K-1的子数组B,然后求B的最小MEX。
由于MEX的范围为[0, K-1],可以用桶来进行统计。令桶B[i]表示i是否出现在B中,初始化为false;遍历B,将出现的元素对应的桶标记为true;最后从0开始逐个扫描桶,找到第一个为false的元素,即为B的最小MEX。
def min_subarray_mex(A: List[int], K: int) -> int:
N = len(A)
if K > N:
return 0
res = K
bucket = [False] * K
for i in range(K - 1, N):
bucket = [False] * K
for j in range(i, i - K, -1):
bucket[A[j] % K] = True
mex = 0
while mex < K and bucket[mex]:
mex += 1
res = min(res, mex)
if res == 0:
return 0
return res
时间复杂度为O(NK),空间复杂度为O(K)。
[1] https://www.acwing.com/solution/content/39262/