你有一组未排序的正整数。从流中读取所有数字后,您必须确定流中缺少的最小正整数。
示例: 正整数流:6 7 8 9 1 2
ans:3
正整数流:1 2 3 4 5
和:6
正整数流:12 87 899
ans:1
我想在不采用任何额外数据结构的情况下解决问题。有可能吗?
我坚持这个问题。我可以在互联网上进行所有的研究,但是,没有运气。 任何人都可以帮忙。
答案 0 :(得分:1)
您可以在使用插入排序读取数组时对数组进行排序(查看数据来自流的方式,这应该是高效的),然后迭代它。如果缺少1
,那就是你的答案。如果它在那里,你可以迭代检查下一个整数是否是数组中的下一个数字,否则下一个整数是缺失的整数。
答案 1 :(得分:0)
在满足两个约束条件的情况下存在一种方法。该算法将扫描流两次,需要256KB内存。
0xFFFFFFFF
。以下显示了此算法。
unsigned int bucket[2^16]
。a
,则bucket[a>>16]++
; 2^16
的存储桶。第一个丢失的无符号整数在此存储桶中。让此存储桶的索引为k
,并将第一个剩余的无符号整数设为n
。然后是k*(2^16) <= n < (k+1)*(2^16)
。a
和k*(2^16) <= a < (k+1)*(2^16)
,则为bucket[a&0xFFFF]++
。h
。这个答案n = k*(2^16) + h
。
注意:第三步中的bucket [0]最多应为2^16 - 1
而不是2^16
,因为无符号整数集不包括0。 / p>
'