给定一个数组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],对于每个元素,检查它是否存在于HashSet中,或者不使用contains()方法来计算O(1)复杂度的搜索。
时间复杂度: O(N)
辅助空间: O(N)
替代方法:可以使用C++中的BitSet解决给定的问题。请按照以下步骤解决问题:
- 初始化一个BitSet变量,长度为N的bset 。
- 对于每个数组元素,使用bset.set(arr [i] -1,0)将其位设置为false,在此将位置arr [i] – 1的位设置为0 。
- 现在,使用变量i从bset._Find_first()迭代到bset.size()– 1 。
- 打印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)