从数组中查找一个排除的元素

问题描述

假设我们有 K 个元素,编号从 0 到 K-1。一个名为 A 的数组,大小为 n,最多包含 K-1 个元素。在 O(n) 的时间和 O(1) 的额外空间中查找 A 中的一个排除元素。

例如,假设我们的元素是 0,1,2,3,4 而 A 是 [4,3]。 我认为我们的额外空间应该用于数组中元素的总和,但我不知道如何从该总和中找到缺​​失的元素之一。

解决方法

@Zabuzard 的评论给出了解决方案,计数排序使用额外的数组来跟踪元素的位置,但我们不需要额外的数组,因为我们知道所有值都是唯一的。>

这个想法是将所有元素放在数组中的索引位置,针对较小的数组大小进行调整,中间部分将被截断。

完全未经测试的代码

if (K-1 == A.size())
  return -1; // error
auto min = 0;
auto max = A.size()-1; // max element will be stored here
auto offset = K-max-1; // K=5,max = 2

while (min < max) {
  auto cand = A[min];
  if (cand != min) {
    std::swap(A[min],A[cand-offset]); // will only be called once per value -> O(1)

    // adjust maximum found
    while (A[max] == cand) {
      --max; // will only be called once per value -> O(1)
      --cand;
    }
  }
  
  // is the new value of min in its correct position
  if (A[min] == min)
    ++min;
}

return min;