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

How to find the minimum number that isn't in a set using stl?

本文关键字:小数 数字 集合 stl 何使用      更新时间:2023-10-16

我有一组正整数。如何找到集合中未包含的最小数字?我能比用O(n)做得更快吗?

例如,我在set s<unsigned int>中插入和删除了很多数字。现在我知道它的大小,我想找到最小的数字,这样就不在设置中

对于集合0 1 2 3 4 5 7 9 10 11 14 15
答案是6

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

您必须对集合中的项进行迭代,直到找到一个不等于(上一个值加一)的值。

我能比用O(n)做得更快吗?

给定如上所述的任务,否——你的数字集中的第一个"洞"可以在序列中的任何地方,这意味着你需要迭代的项目数量,直到你发现这个洞与该集中的项目数量成比例。。。即迭代是O(N)。

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