给定一个数组a[]和一个整数N ,任务是从范围[1, N]中找到所有不存在于给定数组中的自然数。
例子:
Input: N = 5, a[] = {1, 2, 4, 5}
Output: 3
Explanation: 3 is the only integer from the range [1, 5] that is not present in the array.
Input: N = 10, a[] = {1, 3, 4, 6, 8, 10}
Output: 2 5 7 9
朴素的方法:解决这个问题的最简单的方法是遍历范围 [1, N] 并对范围中的每个数字,遍历数组并检查它是否存在于数组中。
时间复杂度: O(N * len),其中len表示数组的长度。
辅助空间: O(1)
高效方法:上述方法可以使用HashSet进行优化。遍历给定数组并将所有数组元素插入到 HashSet 中。然后,遍历范围 [1, N] 并对每个元素,使用 contains() 方法检查它是否存在于HashSet 中,以 O(1) 复杂度计算搜索。
时间复杂度: O(N)
辅助空间: O(N)
替代方法:可以使用 C++ 中的 BitSet 解决给定的问题。请按照以下步骤解决问题:
- 初始化一个 BitSet 变量, bset以N为长度。
- 对于每个数组元素,使用bset.set(arr[i]-1, 0)将其位设置为 false ,它将位置arr[i] – 1处的位设置为0 。
- 现在,使用变量从bset._Find_first()迭代到bset.size() – 1 ,比如i 。
- 打印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 现场工作专业课程和学生竞争性编程现场课程。