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

📅  最后修改于: 2023-12-03 15:12:34.841000             🧑  作者: Mango

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

当我们要处理一个由数字组成的数组,并且需要求出该数组长度为K的所有子阵列的最小非负整数(MEX)时,可以使用以下算法。

算法思路
  1. 计算数组中最大的数字max_num;
  2. 创建长度为max_num+2的桶(bucket)数组,初始值均为0;
  3. 遍历数组的所有长度为K的子数组sub_arr:
    • 将子数组中的所有数字在桶数组中位置对应的值设为1;
    • 在桶数组中从左到右遍历,找到第一个为0的位置index,该位置即为该子数组的最小非负整数(MEX);
  4. 返回所有子数组的最小非负整数(MEX)中的最小值。
代码实现

下面是Python的示例代码:

def min_mex(arr, k):
    max_num = max(arr)
    bucket = [0] * (max_num + 2)
    min_val = float('inf')
    for i in range(len(arr)-k+1):
        sub_arr = arr[i:i+k]
        for num in sub_arr:
            bucket[num] = 1
        for j in range(len(bucket)):
            if bucket[j] == 0:
                min_val = min(min_val, j)
                break
        bucket = [0] * (max_num + 2)
    return min_val
时间复杂度分析

该算法的时间复杂度为O(nk)。其中,n为数组长度,k为子数组长度。遍历所有子数组的时间复杂度为O(n-k+1),在每个子数组中遍历、修改桶数组的时间复杂度为O(k),在桶数组中寻找最小的MEX的时间复杂度为O(max_num)。因此,总的时间复杂度为O((n-k+1)k(max_num))。对于数组中数字较为分散的情况,max_num并不会太大,因此该算法的效率还是比较高的。

参考文献
  • https://cp-algorithms.com/string/string-hashing.html
  • https://www.geeksforgeeks.org/find-the-smallest-positive-number-missing-from-an-unsorted-array/