Find all numbers in range [1, N] that are not present in given Array
Given an array arr[] of size N, where arr[i] is natural numbers less than or equal to N, the task is to find all the numbers in the range [1, N] that are not present in the given array.
Examples:
Input: arr[ ] = {5, 5, 4, 4, 2}
Output: 1 3
Explanation:
For all numbers in the range [1, 5], 1 and 3 are not present in the array.
Input: arr[ ] = {3, 2, 3, 1}
Output: 4
Naive Approach: The simplest approach is to hash every array element using any data structure like the dictionary and then iterate over the range [1, N] and print all numbers not present in the hash.
d
Time Complexity: O(N)
Auxiliary Space: O(N)
Approach: The above approach can be optimized further by marking the number at position arr[i] – 1, negative to mark i is present in the array. Then print all positions of the array elements that are positive as they are missing. Follow the steps below to solve the problem:
- Iterate over the array, arr[] and for each current element, num perform the following steps:
- Update arr[abs(num)-1] to -abs(arr[abs(num)-1]).
- Iterate over the array, arr[] using the variable i, and print the i+1 if arr[i] is positive.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
void getMissingNumbers( int arr[], int N)
{
for ( int i = 0; i < N; i++) {
arr[ abs (arr[i]) - 1] = -( abs (arr[ abs (arr[i]) - 1]));
}
for ( int i = 0; i < N; i++) {
if (arr[i] > 0)
cout << i + 1 << " " ;
}
}
int main()
{
int N = 5;
int arr[] = { 5, 5, 4, 4, 2 };
getMissingNumbers(arr, N);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static void getMissingNumbers( int arr[], int N)
{
for ( int i = 0 ; i < N; i++)
{
arr[(Math.abs(arr[i]) - 1 )]
= -(Math.abs(arr[(Math.abs(arr[i]) - 1 )]));
}
for ( int i = 0 ; i < N; i++)
{
if (arr[i] > 0 )
System.out.print(i + 1 + " " );
}
}
public static void main(String[] args)
{
int N = 5 ;
int arr[] = { 5 , 5 , 4 , 4 , 2 };
getMissingNumbers(arr, N);
}
}
|
Python3
def getMissingNumbers(arr):
for num in arr:
arr[ abs (num) - 1 ] = - ( abs (arr[ abs (num) - 1 ]))
for pos, num in enumerate (arr):
if num > 0 :
print (pos + 1 , end = ' ' )
arr = [ 5 , 5 , 4 , 4 , 2 ]
getMissingNumbers(arr)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static void getMissingNumbers( int []arr, int N)
{
for ( int i = 0; i < N; i++)
{
arr[(Math.Abs(arr[i]) - 1)] = -(Math.Abs(arr[(Math.Abs(arr[i]) - 1)]));
}
for ( int i = 0; i < N; i++)
{
if (arr[i] > 0)
Console.Write(i + 1 + " " );
}
}
public static void Main()
{
int N = 5;
int []arr = { 5, 5, 4, 4, 2 };
getMissingNumbers(arr, N);
}
}
|
Javascript
<script>
function getMissingNumbers(arr){
for (let num of arr)
arr[(Math.abs(num)-1)] = -(Math.abs(arr[(Math.abs(num)-1)]))
for (pos in arr)
if (arr[pos] > 0)
document.write(`${parseInt(pos) + 1} `)
}
let arr = [5, 5, 4, 4, 2]
getMissingNumbers(arr)
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
24 Mar, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...