如何使用 stl 找到不在集合中的最小数字?
How to find the minimum number that isn't in a set using stl?
我有一组正整数。如何找到集合中未包含的最小数字?我能比用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)更昂贵。)解决方案)
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 获取数字小数部分的最佳方法
- C 如何在小数系统中添加两个数字
- 如何设置数字格式以显示C 中的所有小数位数
- 如何解析小数分离器为结肠的数字的字符串表示:
- 获取存储为字符串的数字的小数部分
- 将十进制数字截断为最接近的4个小数和断言
- C++不显示小数位数的数字
- C++ 将数字的小数部分转换为整数
- 显示带小数位数的数字,而不是整数
- 你如何在数字上添加 2 位小数
- 在小数秒内仅用 3 位数字格式化 posix 时间
- 如何从 9 和 90 中提取 2.9 和 2.09,即获取数字等于最大编号的小数部分.二分位数之后的数字
- 两个数字相减时的小数
- 如何在C++中存储数字而不截断小数
- 使用'int'数据类型时出错,即使数字不是小数
- 用两个小数求3个数字的平均值(不舍入!)
- 为什么小数后面的数字都是零
- 由正整数或正小数组成的字符串,转换为I数字格式
- 如何使用std::cout停止输出像5.0这样的数字的小数和零?