📜  在中间插入和插入MEX形成的系列的第k个索引的值(1)

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

在中间插入和插入MEX形成的系列的第k个索引的值

这个主题涉及到一些算法和数据结构的知识,下面将介绍一下算法的原理和实现方法。

什么是MEX

MEX 是基于集合的概念,代表 Missing Element (Missing or Minimum Excluded),即集合中缺少的最小的元素。

例如,对于一个集合 {0, 1, 3, 4, 5},它的 MEX 是 2,因为集合中缺少的最小元素是 2。

中间插入和插入MEX形成的系列

这个系列的定义如下:

  • 第一个数是 0
  • 如果前面的数集合中不存在 MEX,则在数列末尾加入当前 MEX
  • 如果前面的数集合中存在 MEX,则在 MEX 的位置插入 MEX

以此类推,得到一个数列。

例如,运用这个规则,数列的前几个数字是 0, 1, 2, 1, 3, 2, 4, 1, 5...。

求解第k个索引的值

给定一个数 k,我们需要求解这个数列的第k个位置的值。

我们可以使用二分查找的思想来逐步缩小区间。

具体来说,假设当前我们要求的位置是 p。

我们首先需要找到最后一个小于等于 p 的 MEX 的位置,假设这个位置是 i。

如果 i + 1 等于 p,那么当前位置的值就是 MEX。

如果 i + 1 小于 p,那么当前位置的值就是 p。

如果 i + 1 大于 p,那么当前位置的值就是 p - 1。

因为第 i + 1 个位置插入 MEX,那么第 i + 2 个位置就是 MEX,所以我们要让 i + 2 等于 p,因此当前位置需要是 p - 1 。

代码实现

下面是这个算法的具体实现,采用 Python 语言编写。

def solve(k):
    l, r = 0, 2 * k
    while l < r:
        m = (l + r) // 2
        if (m + 2) * (m + 3) // 2 > k:
            r = m
        else:
            l = m + 1
    if (l + 2) * (l + 3) // 2 == k:
        return l + 2
    elif (l + 2) * (l + 3) // 2 < k:
        return k - l - 1
    else:
        return k - l - 2

其中,变量 k 表示要求的位置。

参考文献:Blog@skywalker