当前位置: 首页 > 知识库问答 >
问题:

从整数列表中寻找最小缺失整数的最快方法

宰父君昊
2023-03-14

我有一个100个随机整数的列表。每个随机整数都有一个从0到99的值。重复是允许的,所以列表可以是这样的

56, 1, 1, 1, 1, 0, 2, 6, 99...

我需要找到最小的整数(

我最初的解决方案是这样的:

vector<int> integerList(100); //list of random integers
...
vector<bool> listedIntegers(101, false);
for (int theInt : integerList)
{
    listedIntegers[theInt] = true;
}
int smallestInt;
for (int j = 0; j < 101; j++)
{
    if (!listedIntegers[j])
    {
        smallestInt = j;
        break;
    }
}

但这需要一个用于记账的辅助数组和第二次(可能是完整的)列表迭代。我需要执行这个任务数百万次(实际应用程序是在贪婪的图形着色算法中,我需要用顶点邻接列表找到最小的未使用颜色值),所以我想知道是否有一种聪明的方法可以在没有太多开销的情况下获得相同的结果?

共有3个答案

柯唯
2023-03-14

由于无论如何您都必须扫描整个列表,因此您拥有的算法已经相当不错。在不测量的情况下,我能建议的唯一改进(这肯定会加快速度)是摆脱你的矢量

这样,您就不必每次都在堆上分配数组的费用,并且您可以更快地获得第一个未使用的数字(第一个0位的位置)。要找到包含第一个0位的单词,您只需要找到第一个不是最大值的单词,并且可以使用位摆弄技巧来非常快速地获得该单词中的第一个0位。

蔺山
2023-03-14

我相信没有比这更快的方法了。在这种情况下,您可以重用vector

虽然更好的方法可能是重新考虑整个算法,以完全消除这一步。也许您可以在算法的每个步骤中更新最不常用的颜色?

唐泳
2023-03-14

已经一年了,但是…

脑海中浮现的一个想法是在迭代列表时跟踪未使用值的间隔。例如,为了实现高效查找,可以将间隔作为元组保留在二进制搜索树中。

因此,使用示例数据:

< code>56,1,1,1,0,2,6,99...

您最初会有未使用的间隔 [0..99],然后在处理每个输入值时:

56: [0..55][57..99]
1: [0..0][2..55][57..99]
1: no change
1: no change
1: no change
0: [2..55][57..99]
2: [3..55][57..99]
6: [3..5][7..55][57..99]
99: [3..5][7..55][57..98]

结果(最低剩余间隔中的最低值):3

 类似资料:
  • that,给定一个包含N个整数的数组A,返回A中不出现的最小正整数(大于0)。 例如,给定A=[1, 3, 6, 4, 1, 2],函数应该返回5。 给定A=[1,2,3],函数应该返回4。 给定一个=[−1.−3] ,函数应返回1。 为以下假设编写一个有效的算法:

  • 本文向大家介绍从一个无序的整数数组中,找出最小和最大数之间缺失的数字,要求最小的时间复杂度相关面试题,主要包含被问及从一个无序的整数数组中,找出最小和最大数之间缺失的数字,要求最小的时间复杂度时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我有一个从1到100(包括两端)的数字数组。数组的大小为100。将数字随机添加到数组中,但是数组中有一个随机的空插槽。找到该插槽的最快方法是什么,应该在插槽中放入多少?最好使用Java解决方案。 问题答案: 你可以在O(n)中执行此操作。遍历数组并计算所有数字的总和。现在,从1到N的自然数之和可以表示为。在你的情况下,N = 100。 从中减去数组的总和,其中N = 100。 那是丢失

  • 如何在不更改数组顺序的情况下找到int数组中的最小值? 代码段: 我不知道如何在tenIntArray中找到最小的数组值并显示位置 例如,数组包含- 输出应该说

  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 经典的问题陈述是:给定一个未排序的整数数组,找到中不存在的最小正整数。 在一个经典的问题陈述中,你只得到一个数组,你可以在这里、这里和这里找到很多关于这个问题的解决方案和资源。 在我的问题中,你得到了两个数组,和,长度均为。构造一个长度为 的数组 ,其“最小缺失整数”是可能的最大值。 必须是 或 。 我们如何以< code>O(N)的最坏情况时间和空间复杂度解决这个问题? 假设: