如何使用stl查找不在集合中的最小数字?

时间:2016-05-17 00:48:59

标签: c++ stl set

我有一组正整数。如何找到集合中未包含的最小数量?我可以比O(n)更快地完成吗?

例如我有set s<unsigned int>我插入并删除了很多数字。现在我知道它的大小,我想找到最小数字,这不在集合

for set 0 1 2 3 4 5 7 9 10 11 14 15
答案是6

1 个答案:

答案 0 :(得分:3)

  

我有一组正整数。如何找到最小数量   是不是包含在集合中?

你必须迭代集合中的项目,直到找到一个不等于(前一个值加一个)的值。

  

我可以比O(n)更快地完成吗?

鉴于所述的任务,没有 - 第一个&#34;洞&#34;在你的数字集合中,可以是序列中的任何位置,这意味着你需要迭代的项目数量,直到你发现这个洞将与集合中的项目数量成比例...即迭代是O(N)。

也就是说,如果允许您在创建数据结构时有一定的灵活性,那么您可以巧妙地解决问题。例如,不是建立一组数字,而是从两组开始 - 你的原始组,再加上第二组,它总是包含你第一组当前没有包含的任何数字。每当您在第一组中插入数字时,都会将其从第二组中删除,反之亦然。然后找到最小缺失数只是读取第二组中的第一个值,即O(1)操作。 (当然,如果可能的数字范围很小,这只是实用的,否则你的第二组将占用大量内存。如果这是一个问题,你可以通过维护[min]列表来减少内存使用量。 ,max]范围而不仅仅是单个值,但维护它的代码会变得更复杂,最终可能比原始/天真的O(n)解决方案更昂贵)