C++ 算法:高效查找数组中缺失的最小正整数
C++ 算法:高效查找数组中缺失的最小正整数
这段代码实现了一个 C++ 函数,用于在一个整数数组中找出未出现的最小正整数。
int find(int A[], int n) {
int i, *B = new int[n];
for (int k = 0; k < n; ++k) B[k] = 0;
for (i = 0; i < n; ++i) {
if (A[i] > 0 && A[i] <= n) {
B[A[i] - 1] = 1;
}
}
for (i = 0; i < n; ++i) {
if (B[i] == 0) break;
}
delete[] B;
return i + 1;
}
代码解释
-
int find(int A[], int n)- 定义一个名为find的函数,它接收一个整数数组A和数组长度n作为参数,并返回一个整数作为结果,表示数组中未出现的最小正整数。 -
int i, *B = new int[n];- 声明一个整数变量i用于循环索引,并使用new运算符在堆上动态分配一个大小为n的整数数组B。数组B用来标记数字是否出现过,初始值都设置为 0。 -
for (int k = 0; k < n; ++k) B[k] = 0;- 这是一个循环,用来初始化数组B中的每个元素为 0,表示所有的数字都未出现过。 -
for (i = 0; i < n; ++i)- 另一个循环,用于遍历整数数组A中的每个元素。 -
if (A[i] > 0 && A[i] <= n)- 检查当前元素A[i]是否为正整数并且小于等于数组长度n。这是因为我们只关注数组中出现的正整数,并且它们必须在数组长度范围内。 -
B[A[i] - 1] = 1;- 如果A[i]满足条件,则将数组B中索引为A[i] - 1的元素设置为 1,表示数字A[i]在数组A中出现过。通过这种方式,B数组充当了数字出现的标记数组。 -
for (i = 0; i < n; ++i)- 再次使用一个循环遍历数组B。 -
if (B[i] == 0) break;- 在B数组中查找第一个值为 0 的元素,这意味着对应索引的数字在A数组中没有出现过。一旦找到第一个值为 0 的元素,就立即跳出循环。 -
delete[] B;- 使用delete[]运算符释放之前在堆上分配的数组B的内存,避免内存泄漏。 -
return i + 1;- 返回循环跳出时的i值加 1,即代表在数组A中缺失的最小正整数。
算法分析
该算法的主要思想是利用一个额外的标记数组 B 来记录数字的出现情况。它通过遍历 A 数组,并将每个出现的数字 A[i] 对应的索引 A[i] - 1 在 B 数组中标记为 1。最后,通过遍历 B 数组寻找第一个值为 0 的元素,即可找到缺失的最小正整数。
-
时间复杂度: 该算法的运行时间主要取决于遍历数组
A和B的时间,因此时间复杂度为 O(n),其中 n 是数组A的长度。 -
空间复杂度: 该算法需要额外使用一个大小为 n 的整数数组
B来标记数字出现情况,因此空间复杂度为 O(n)。
总结
这个函数通过使用额外的标记数组,以高效的方式找到了数组中缺失的最小正整数。该算法的时间复杂度和空间复杂度都为 O(n),在大多数情况下具有较好的效
原文地址: https://www.cveoy.top/t/topic/bUwn 著作权归作者所有。请勿转载和采集!