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;
}

代码解释

  1. int find(int A[], int n) - 定义一个名为 find 的函数,它接收一个整数数组 A 和数组长度 n 作为参数,并返回一个整数作为结果,表示数组中未出现的最小正整数。

  2. int i, *B = new int[n]; - 声明一个整数变量 i 用于循环索引,并使用 new 运算符在堆上动态分配一个大小为 n 的整数数组 B。数组 B 用来标记数字是否出现过,初始值都设置为 0。

  3. for (int k = 0; k < n; ++k) B[k] = 0; - 这是一个循环,用来初始化数组 B 中的每个元素为 0,表示所有的数字都未出现过。

  4. for (i = 0; i < n; ++i) - 另一个循环,用于遍历整数数组 A 中的每个元素。

  5. if (A[i] > 0 && A[i] <= n) - 检查当前元素 A[i] 是否为正整数并且小于等于数组长度 n。这是因为我们只关注数组中出现的正整数,并且它们必须在数组长度范围内。

  6. B[A[i] - 1] = 1; - 如果 A[i] 满足条件,则将数组 B 中索引为 A[i] - 1 的元素设置为 1,表示数字 A[i] 在数组 A 中出现过。通过这种方式,B 数组充当了数字出现的标记数组。

  7. for (i = 0; i < n; ++i) - 再次使用一个循环遍历数组 B

  8. if (B[i] == 0) break; - 在 B 数组中查找第一个值为 0 的元素,这意味着对应索引的数字在 A 数组中没有出现过。一旦找到第一个值为 0 的元素,就立即跳出循环。

  9. delete[] B; - 使用 delete[] 运算符释放之前在堆上分配的数组 B 的内存,避免内存泄漏。

  10. return i + 1; - 返回循环跳出时的 i 值加 1,即代表在数组 A 中缺失的最小正整数。

算法分析

该算法的主要思想是利用一个额外的标记数组 B 来记录数字的出现情况。它通过遍历 A 数组,并将每个出现的数字 A[i] 对应的索引 A[i] - 1B 数组中标记为 1。最后,通过遍历 B 数组寻找第一个值为 0 的元素,即可找到缺失的最小正整数。

  • 时间复杂度: 该算法的运行时间主要取决于遍历数组 AB 的时间,因此时间复杂度为 O(n),其中 n 是数组 A 的长度。

  • 空间复杂度: 该算法需要额外使用一个大小为 n 的整数数组 B 来标记数字出现情况,因此空间复杂度为 O(n)。

总结

这个函数通过使用额外的标记数组,以高效的方式找到了数组中缺失的最小正整数。该算法的时间复杂度和空间复杂度都为 O(n),在大多数情况下具有较好的效

C++ 算法:高效查找数组中缺失的最小正整数

原文地址: https://www.cveoy.top/t/topic/bUwn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录