如何从未排序的正整数流中找到最小的缺失正整数?

时间:2012-12-20 13:45:47

标签: algorithm

  

可能重复:
  Find the Smallest Integer Not in a List

你有一组未排序的正整数。从流中读取所有数字后,您必须确定流中缺少的最小正整数。

示例: 正整数流:6 7 8 9 1 2

ans:3

正整数流:1 2 3 4 5

和:6

正整数流:12 87 899

ans:1

我想在不采用任何额外数据结构的情况下解决问题。有可能吗?

我坚持这个问题。我可以在互联网上进行所有的研究,但是,没有运气。 任何人都可以帮忙。

2 个答案:

答案 0 :(得分:1)

您可以在使用插入排序读取数组时对数组进行排序(查看数据来自流的方式,这应该是高效的),然后迭代它。如果缺少1,那就是你的答案。如果它在那里,你可以迭代检查下一个整数是否是数组中的下一个数字,否则下一个整数是缺失的整数。

答案 1 :(得分:0)

在满足两个约束条件的情况下存在一种方法。该算法将扫描流两次,需要256KB内存。

  1. 每个元素小于或等于0xFFFFFFFF
  2. 流中的所有元素都是不同的。
  3. 以下显示了此算法。

    1. 分配数组:unsigned int bucket[2^16]
    2. 扫描此流数据。如果当前数据为a,则bucket[a>>16]++;
    3. 扫描此流后,找到第一个值小于2^16的存储桶。第一个丢失的无符号整数在此存储桶中。让此存储桶的索引为k,并将第一个剩余的无符号整数设为n。然后是k*(2^16) <= n < (k+1)*(2^16)
    4. 将所有存储桶的值重置为零。
    5. 再次扫描此流媒体数据。如果当前数据为ak*(2^16) <= a < (k+1)*(2^16),则为bucket[a&0xFFFF]++
    6. 再次扫描此流后,找到第一个值为零的存储桶。让此存储桶的索引为h
    7. 这个答案n = k*(2^16) + h

      注意:第三步中的bucket [0]最多应为2^16 - 1而不是2^16,因为无符号整数集不包括0。 / p>

      '