Find all missing numbers from a given sorted array
Given a sorted array arr[] of N integers, The task is to find the multiple missing elements in the array between the ranges [arr[0], arr[N-1]].
Examples:
Input: arr[] = {6, 7, 10, 11, 13}
Output: 8 9 12
Explanation:
The elements of the array are present in the range of the maximum and minimum array element [6, 13]. Therefore, the total values will be {6, 7, 8, 9, 10, 11, 12, 13}.
The elements from the above range which are missing from the array are {8, 9, 12}.
Input: arr[] = {1, 2, 4, 6}
Output: 3 5
Naive Approach: The naive idea is to iterate over the difference between the consecutive pair of elements and the print all the numbers in this range if the difference is non-zero. Below are the steps:
- Initialize the variable diff which is equal to arr[0] – 0.
- Now traverse the array and see if the difference between arr[i] – i and diff is zero or not.
- If the difference is not equal to zero in the above steps, then the missing element is found.
- To find the multiple missing elements run a loop inside it and see if the diff is less than arr[i] – i then print the missing element i.e., i + diff.
- Now increment the diff as the difference is increased now.
- Repeat from step 2 until all the missing numbers are not found.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printMissingElements( int arr[], int N)
{
int diff = arr[0] - 0;
for ( int i = 0; i < N; i++) {
if (arr[i] - i != diff) {
while (diff < arr[i] - i) {
cout << i + diff << " " ;
diff++;
}
}
}
}
int main()
{
int arr[] = { 6, 7, 10, 11, 13 };
int N = sizeof (arr) / sizeof ( int );
printMissingElements(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void printMissingElements( int arr[],
int N)
{
int diff = arr[ 0 ] - 0 ;
for ( int i = 0 ; i < N; i++)
{
if (arr[i] - i != diff)
{
while (diff < arr[i] - i)
{
System.out.print((i + diff) + " " );
diff++;
}
}
}
}
public static void main (String[] args)
{
int arr[] = { 6 , 7 , 10 , 11 , 13 };
int N = arr.length;
printMissingElements(arr, N);
}
}
|
Python3
def printMissingElements(arr, N):
diff = arr[ 0 ]
for i in range (N):
if (arr[i] - i ! = diff):
while (diff < arr[i] - i):
print (i + diff, end = " " )
diff + = 1
arr = [ 6 , 7 , 10 , 11 , 13 ]
N = len (arr)
printMissingElements(arr, N)
|
C#
using System;
class GFG{
static void printMissingElements( int [] arr,
int N)
{
int diff = arr[0] - 0;
for ( int i = 0; i < N; i++)
{
if (arr[i] - i != diff)
{
while (diff < arr[i] - i)
{
Console.Write(i + diff + " " );
diff++;
}
}
}
}
static void Main()
{
int [] arr = { 6, 7, 10, 11, 13 };
int N = arr.Length;
printMissingElements(arr, N);
}
}
|
Javascript
<script>
function prletMissingElements(arr, N)
{
let diff = arr[0] - 0;
for (let i = 0; i < N; i++)
{
if (arr[i] - i != diff)
{
while (diff < arr[i] - i)
{
document.write((i + diff) + " " );
diff++;
}
}
}
}
let arr = [ 6, 7, 10, 11, 13 ];
let N = arr.length;
prletMissingElements(arr, N);
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: The idea is to use Hashing to optimize the above approach. Create a boolean array(say b[]) of size equal to the maximum element in the array and mark only those positions in the array b[] which are present in the given array. Print all the index in the array b[] that are not marked.
Below are the steps:
- Initialize a boolean array b[] with zero of size equals to the maximum element of the array.
- Iterate over the given array and mark for each element in the given array mark that index as true in the array b[].
- Now traverse the given array b[] from index arr[0] and print those index whose value is false as they are the element that is missing in the given array.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printMissingElements( int arr[], int N)
{
int b[arr[N - 1] + 1] = { 0 };
for ( int i = 0; i < N; i++) {
b[arr[i]] = 1;
}
for ( int i = arr[0]; i <= arr[N - 1]; i++) {
if (b[i] == 0) {
cout << i << " " ;
}
}
}
int main()
{
int arr[] = { 6, 7, 10, 11, 13 };
int N = sizeof (arr) / sizeof ( int );
printMissingElements(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void printMissingElements( int arr[],
int N)
{
int [] b = new int [arr[N - 1 ] + 1 ];
for ( int i = 0 ; i < N; i++)
{
b[arr[i]] = 1 ;
}
for ( int i = arr[ 0 ]; i <= arr[N - 1 ]; i++)
{
if (b[i] == 0 )
{
System.out.print(i + " " );
}
}
}
public static void main (String[] args)
{
int arr[] = { 6 , 7 , 10 , 11 , 13 };
int N = arr.length;
printMissingElements(arr, N);
}
}
|
Python3
def printMissingElements(arr, N):
b = [ 0 ] * (arr[N - 1 ] + 1 )
for i in range (N):
b[arr[i]] = 1
for i in range (arr[ 0 ], arr[N - 1 ] + 1 ):
if (b[i] = = 0 ):
print (i, end = " " )
arr = [ 6 , 7 , 10 , 11 , 13 ]
N = len (arr)
printMissingElements(arr, N)
|
C#
using System;
class GFG{
static void printMissingElements( int []arr,
int N)
{
int [] b = new int [arr[N - 1] + 1];
for ( int i = 0; i < N; i++)
{
b[arr[i]] = 1;
}
for ( int i = arr[0]; i <= arr[N - 1];
i++)
{
if (b[i] == 0)
{
Console.Write(i + " " );
}
}
}
public static void Main(String[] args)
{
int []arr = {6, 7, 10, 11, 13};
int N = arr.Length;
printMissingElements(arr, N);
}
}
|
Javascript
<script>
function printMissingElements(arr, N)
{
let b = new Uint8Array(arr[N - 1] + 1);
for (let i = 0; i < N; i++) {
b[arr[i]] = 1;
}
for (let i = arr[0]; i <= arr[N - 1]; i++) {
if (b[i] == 0) {
document.write( i + " " );
}
}
}
let arr = [ 6, 7, 10, 11, 13 ];
let N = arr.length;
printMissingElements(arr, N);
</script>
|
Time Complexity: O(M), where M is the maximum element of the array.
Auxiliary Space: O(M)
Most Efficient And Simple Approach:
In below approach simple we create a variable (cnt) this variable keeps the track of element present in array
1. We need to traverse the arr[0] to arr[N] to find missing number between it.
2. In for loop if arr[cnt] match to current element then we do not print that element and skip that element because it is present in array
once we found element then we increment the cnt++ for pointing next element in array
3. In else part we just print the element which does not match or present in array
C++
#include <bits/stdc++.h>
using namespace std;
void printMissingElements( int arr[], int N)
{
int cnt = 0;
for ( int i = arr[0]; i <= arr[N - 1]; i++) {
if (arr[cnt] == i) {
cnt++;
}
else {
cout << i << " " ;
}
}
}
int main()
{
int arr[] = { 6, 7, 10, 11, 13 };
int N = sizeof (arr) / sizeof (arr[0]);
printMissingElements(arr, N);
return 0;
}
|
Java
import java.io.*;
class GFG {
public static void printMissingElements( int arr[], int N)
{
int cnt = 0 ;
for ( int i = arr[ 0 ]; i <= arr[N - 1 ]; i++)
{
if (arr[cnt] == i)
{
cnt++;
}
else
{
System.out.print(i + " " );
}
}
}
public static void main (String[] args)
{
int arr[] = { 6 , 7 , 10 , 11 , 13 };
int N = arr.length;
printMissingElements(arr, N);
}
}
|
Python3
def printMissingElements(arr, N):
cnt = 0
for i in range (arr[ 0 ], arr[N - 1 ] + 1 ):
if (arr[cnt] = = i):
cnt + = 1
else :
print (i , end = " " )
arr = [ 6 , 7 , 10 , 11 , 13 ]
N = len (arr)
printMissingElements(arr, N)
|
C#
using System;
using System.Linq;
public class GFG{
public static void printMissingElements( int [] arr, int N)
{
int cnt = 0;
for ( int i = arr[0]; i <= arr[N - 1]; i++)
{
if (arr[cnt] == i)
{
cnt++;
}
else
{
Console.Write(i + " " );
}
}
}
static public void Main ()
{
int [] arr = { 6, 7, 10, 11, 13 };
int N = arr.Length;
printMissingElements(arr, N);
}
}
|
Javascript
<script>
function printMissingElements(arr, N)
{
var cnt = 0;
for ( var i = arr[0]; i <= arr[N - 1]; i++) {
if (arr[cnt] == i)
{
cnt++;
}
else
{
document.write(i + " " );
}
}
}
var arr = [ 6, 7, 10, 11, 13 ];
var N = arr.length;
printMissingElements(arr, N);
</script>
|
Time Complexity: O(N), where N is the maximum element of the array.
Auxiliary Space: O(1) Because of this method the overflow of hash or extra space will be saved.
Last Updated :
08 Feb, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...