📌  相关文章
📜  长度为K的所有子阵列的最小MEX(1)

📅  最后修改于: 2023-12-03 14:58:17.195000             🧑  作者: Mango

长度为K的所有子阵列的最小MEX介绍

什么是MEX

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/