📌  相关文章
📜  给定数组中不存在的最大为 N 的正整数

📅  最后修改于: 2021-10-27 07:16:34             🧑  作者: Mango

给定一个数组a[]和一个整数N ,任务是从范围[1, N]中找到所有不存在于给定数组中的自然数。

例子:

朴素的方法:解决这个问题的最简单的方法是遍历范围 [1, N] 并对范围中的每个数字,遍历数组并检查它是否存在于数组中。
时间复杂度: O(N * len),其中len表示数组的长度。
辅助空间: O(1)

高效方法:上述方法可以使用HashSet进行优化。遍历给定数组并将所有数组元素插入到 HashSet 中。然后,遍历范围 [1, N] 并对每个元素,使用 contains() 方法检查它是否存在于HashSet 中,以 O(1) 复杂度计算搜索。
时间复杂度: O(N)
辅助空间: O(N)

替代方法:可以使用 C++ 中的 BitSet 解决给定的问题。请按照以下步骤解决问题:

  1. 初始化一个 BitSet 变量, bsetN为长度。
  2. 对于每个数组元素,使用bset.set(arr[i]-1, 0)将其位设置为 false ,它将位置arr[i] – 1处的位设置为0
  3. 现在,使用变量从bset._Find_first()迭代到bset.size() – 1 ,比如i
  4. 打印i + 1并设置bset._Find_next()

下面是上述方法的实现。

C++
// CPP program for the above approach
 
#include 
using namespace std;
 
// Function to find positive integers
// from 1 to N that are not present in the array
void findMissingNumbers(int arr[], int len)
{
    const int M = 15;
 
    // Declare bitset
    bitset bset;
 
    // Iterate from 0 to M - 1
    for (int i = 0; i < M; i++) {
        bset.set(i);
    }
 
    // Iterate from 0 to len - 1
    for (int i = 0; i < len; i++) {
        bset.set(arr[i] - 1, 0);
    }
 
    // Iterate from bset._Find_first()
    // to bset.size() - 1
    for (int i = bset._Find_first();
         i < bset.size();
         i = bset._Find_next(i)) {
 
        if (i + 1 > len)
            break;
 
        cout << i + 1 << endl;
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 4, 6, 8, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    findMissingNumbers(arr, n);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG
{
 
    // Function to find positive integers
    // from 1 to N that are not present in the array
    static void findMissingNumbers(int[] arr, int len)
    {
        int M = 15;
 
        // Declare bitset
        BitSet bset = new BitSet(M);
 
        // Iterate from 0 to M - 1
        for (int i = 0; i < M; i++)
        {
            bset.set(i);
        }
 
        // Iterate from 0 to len - 1
        for (int i = 0; i < len; i++)
        {
            bset.set(arr[i] - 1, false);
        }
 
        // Iterate from bset._Find_first()
        // to bset.size() - 1
        for (int i = bset.nextSetBit(0); i >= 0;
             i = bset.nextSetBit(i + 1))
        {
            if (i + 1 > len)
                break;
            System.out.println(i + 1);
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int[] arr = new int[] { 1, 2, 4, 6, 8, 9 };
        int n = arr.length;
        findMissingNumbers(arr, n);
    }
}
 
// This code is contributed by Dharanendra L V


输出:
3
5

时间复杂度: O(N)
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程