可能重复:
查找不在列表中的最小整数
你有一个未排序的正整数流。从流中读取所有数字后,您必须确定流中缺少的最小正整数。
示例: 正整数流:6 7 8 9 1 2
答:3
正整数流:1 2 3 4 5
和:6
正整数流:12 87 899
答:1
我想在不采用任何额外数据结构的情况下解决问题。可能吗?
我被困在这个问题上。我在互联网上做了所有的研究,但是,没有运气。谁能帮忙。
可能重复:
查找不在列表中的最小整数
你有一个未排序的正整数流。从流中读取所有数字后,您必须确定流中缺少的最小正整数。
示例: 正整数流:6 7 8 9 1 2
答:3
正整数流:1 2 3 4 5
和:6
正整数流:12 87 899
答:1
我想在不采用任何额外数据结构的情况下解决问题。可能吗?
我被困在这个问题上。我在互联网上做了所有的研究,但是,没有运气。谁能帮忙。
您可以在读取数组时使用插入排序对数组进行排序(查看数据如何来自流,这应该很有效),然后遍历它。如果1
缺少,这就是你的答案。如果它在那里,您可以迭代检查下一个整数是否是数组中的下一个数字,否则下一个整数是缺少的一个。
在满足以下两个约束的情况下,存在一种方法。该算法将扫描流两次并需要 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。
ˊ