微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从数组中查找一个排除的元素

假设我们有 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。