可能重复:
查找不在列表中的最小整数
你有一个未排序的正整数流。从流中读取所有数字后,您必须确定流中缺少的最小正整数。
示例: 正整数流: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。
ˊ