Given an unsorted array of size n. Array elements are in the range of 1 to n. One number from set {1, 2, …n} is missing and one number occurs twice in the array. Find these two numbers.
Examples:
Input: arr[] = {3, 1, 3}
Output: Missing = 2, Repeating = 3
Explanation: In the array, 2 is missing and 3 occurs twice
Input: arr[] = {4, 3, 6, 2, 1, 1}
Output: Missing = 5, Repeating = 1
Below are various methods to solve the problems:
Method 1 (Use Sorting)
Approach:
- Sort the input array.
- Traverse the array and check for missing and repeating.
C++
#include <bits/stdc++.h>
using namespace std;
void printTwoElements( int arr[], int n){\
sort(arr,arr+n);
cout << "The repeating element is " ;
for ( int i=0;i<n-1;i++){
if (arr[i]==arr[i+1]){
cout<<arr[i]<<endl;
break ;
}
}
cout << "and the missing element is " ;
for ( int i=1;i<=n;i++){
if (i!=arr[i-1]){
cout<<i<<endl;
break ;
}
}
}
int main() {
int arr[] = { 7, 3, 4, 5, 5, 6, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
printTwoElements(arr, n);
return 0;
}
|
Java
import java.util.*;
public class Main {
public static void printTwoElements( int [] arr, int n)
{
Arrays.sort(arr);
System.out.print( "The repeating element is " );
for ( int i = 0 ; i < n - 1 ; i++) {
if (arr[i] == arr[i + 1 ]) {
System.out.println(arr[i]);
break ;
}
}
System.out.print( "and the missing element is " );
for ( int i = 1 ; i <= n; i++) {
if (i != arr[i - 1 ]) {
System.out.print(i);
break ;
}
}
}
public static void main(String[] args)
{
int [] arr = { 7 , 3 , 4 , 5 , 5 , 6 , 2 };
int n = arr.length;
printTwoElements(arr, n);
}
}
|
Python3
def printTwoElements(arr, n):
arr.sort()
print ( "The repeating element is" ,end = " " )
for i in range ( 0 , n - 1 ):
if (arr[i] = = arr[i + 1 ]):
print (arr[i])
break
print ( "and the missing element is" ,end = " " )
for i in range ( 1 , n + 1 ):
if (i ! = arr[i - 1 ]):
print (i)
break
arr = [ 7 , 3 , 4 , 5 , 5 , 6 , 2 ]
n = len (arr)
printTwoElements(arr, n)
|
C#
using System;
public class GFG {
public static void printTwoElements( int [] arr, int n)
{
Array.Sort(arr);
Console.Write( "The repeating element is " );
for ( int i = 0; i < n - 1; i++) {
if (arr[i] == arr[i + 1]) {
Console.WriteLine(arr[i]);
break ;
}
}
Console.Write( "and the missing element is " );
for ( int i = 1; i <= n; i++) {
if (i != arr[i - 1]) {
Console.Write(i);
break ;
}
}
}
static public void Main()
{
int [] arr = { 7, 3, 4, 5, 5, 6, 2 };
int n = arr.Length;
printTwoElements(arr, n);
}
}
|
Javascript
function printTwoElements( arr, n)
{
arr.sort();
console.log( "The repeating element is " );
for (let i = 0; i < n - 1; i++)
{
if (arr[i] == arr[i + 1])
{
console.log(arr[i]);
break ;
}
}
console.log( "and the missing element is " );
for (let i = 1; i <= n; i++)
{
if (i != arr[i - 1])
{
console.log(i);
break ;
}
}
}
let arr = [ 7, 3, 4, 5, 5, 6, 2 ];
let n = arr.length;
printTwoElements(arr, n);
|
OutputThe repeating element is 5
and the missing element is 1
Time Complexity: O(nLogn)
Auxiliary Space: O(1) (No extra array was used)
Thanks to LoneShadow for suggesting this method.
Method 2 (Use count array)
Approach:
- Create a temp array temp[] of size n with all initial values as 0.
- Traverse the input array arr[], and do the following for each arr[i]
- if(temp[arr[i]-1] == 0), set temp[arr[i]-1] = 1;
- if(temp[arr[i]-1] == 1) output “arr[i]” //repeating number
- Traverse temp[] and output ‘i+1’ corresponding to the element of array temp[] having value as 0. (This is the missing number)
Note that, we use ‘arr[i]-1’ as the corresponding element to the ‘arr[i]’ in temp[] array, as indexing in an array starts from 0 to n-1 and the input array arr[] has numbers from 1 to n.
C++
#include <bits/stdc++.h>
using namespace std;
void printTwoElements( int arr[], int n)
{
int temp[n] = {};
int repeatingNumber=-1;
int missingNumber=-1;
for ( int i = 0; i < n; i++) {
temp[arr[i]-1]++;
if (temp[arr[i] - 1] > 1) {
repeatingNumber = arr[i];
break ;
}
}
for ( int i = 0; i < n; i++) {
if (temp[i] == 0) {
missingNumber = i + 1;
break ;
}
}
cout << "The repeating number is " << repeatingNumber<< "."
<< endl;
cout << "The missing number is " << missingNumber<< "."
<< endl;
}
int main()
{
int arr[] = { 7, 3, 4, 5, 5, 6, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
printTwoElements(arr, n);
return 0;
}
|
Java
import java.io.*;
class Main {
static void printTwoElements( int [] arr, int n)
{
int [] temp
= new int [n];
int repeatingNumber = - 1 ;
int missingNumber = - 1 ;
for ( int i = 0 ; i < n; i++) {
temp[arr[i] - 1 ]++;
if (temp[arr[i] - 1 ] > 1 ) {
repeatingNumber = arr[i];
}
}
for ( int i = 0 ; i < n; i++) {
if (temp[i] == 0 ) {
missingNumber = i + 1 ;
break ;
}
}
System.out.println( "The repeating number is "
+ repeatingNumber + "." );
System.out.println( "The missing number is "
+ missingNumber + "." );
}
public static void main(String[] args)
{
int [] arr = { 7 , 3 , 4 , 5 , 5 , 6 , 2 };
int n = arr.length;
printTwoElements(arr, n);
}
}
|
Python3
def printTwoElements(arr):
n = len (arr)
temp = [ 0 ] * n
repeatingNumber = - 1
missingNumber = - 1
for i in range (n):
temp[arr[i] - 1 ] + = 1
if temp[arr[i] - 1 ] > 1 :
repeatingNumber = arr[i]
for i in range (n):
if temp[i] = = 0 :
missingNumber = i + 1
break
print ( "The repeating number is" , repeatingNumber, "." )
print ( "The missing number is" , missingNumber, "." )
arr = [ 7 , 3 , 4 , 5 , 5 , 6 , 2 ]
printTwoElements(arr)
|
C#
using System;
public class Program
{
public static void printTwoElements( int [] arr, int n)
{
int [] temp = new int [n];
int repeatingNumber = -1;
int missingNumber = -1;
for ( int i = 0; i < n; i++)
{
temp[arr[i] - 1]++;
if (temp[arr[i] - 1] > 1)
{
repeatingNumber = arr[i];
}
}
for ( int i = 0; i < n; i++)
{
if (temp[i] == 0)
{
missingNumber = i + 1;
break ;
}
}
Console.WriteLine( "The repeating number is " + repeatingNumber + "." );
Console.WriteLine( "The missing number is " + missingNumber + "." );
}
public static void Main()
{
int [] arr = { 7, 3, 4, 5, 5, 6, 2 };
int n = arr.Length;
printTwoElements(arr, n);
}
}
|
Javascript
function printTwoElements(arr) {
const n = arr.length;
const temp = Array(n).fill(0);
let repeatingNumber = -1;
let missingNumber = -1;
for (let i = 0; i < n; i++) {
temp[arr[i] - 1]++;
if (temp[arr[i] - 1] > 1) {
repeatingNumber = arr[i];
}
}
for (let i = 0; i < n; i++) {
if (temp[i] === 0) {
missingNumber = i + 1;
break ;
}
}
console.log(`The repeating number is ${repeatingNumber}.`);
console.log(`The missing number is ${missingNumber}.`);
}
const arr = [7, 3, 4, 5, 5, 6, 2];
printTwoElements(arr);
|
OutputThe repeating number is 5.
The missing number is 1.
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 3 (Use elements as Index and mark the visited places)
Approach:
Traverse the array. While traversing, use the absolute value of every element as an index and make the value at this index negative to mark it visited. If something is already marked negative then this is the repeating element. To find the missing, traverse the array again and look for a positive value.
C++
#include <bits/stdc++.h>
using namespace std;
void printTwoElements( int arr[], int size)
{
int i;
cout << "The repeating element is " ;
for (i = 0; i < size; i++) {
if (arr[ abs (arr[i]) - 1] > 0)
arr[ abs (arr[i]) - 1] = -arr[ abs (arr[i]) - 1];
else
cout << abs (arr[i]) << "\n" ;
}
cout << "and the missing element is " ;
for (i = 0; i < size; i++) {
if (arr[i] > 0)
cout << (i + 1);
}
}
int main()
{
int arr[] = { 7, 3, 4, 5, 5, 6, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
printTwoElements(arr, n);
}
|
C
#include <stdio.h>
#include <stdlib.h>
void printTwoElements( int arr[], int size)
{
int i;
printf ( "\nThe repeating element is " );
for (i = 0; i < size; i++) {
if (arr[ abs (arr[i]) - 1] > 0)
arr[ abs (arr[i]) - 1] = -arr[ abs (arr[i]) - 1];
else
printf ( " %d " , abs (arr[i]));
}
printf ( "\nand the missing element is " );
for (i = 0; i < size; i++) {
if (arr[i] > 0)
printf ( "%d" , i + 1);
}
}
int main()
{
int arr[] = { 7, 3, 4, 5, 5, 6, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
printTwoElements(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void printTwoElements( int arr[], int size)
{
int i;
System.out.print( "The repeating element is " );
for (i = 0 ; i < size; i++) {
int abs_val = Math.abs(arr[i]);
if (arr[abs_val - 1 ] > 0 )
arr[abs_val - 1 ] = -arr[abs_val - 1 ];
else
System.out.println(abs_val);
}
System.out.print( "and the missing element is " );
for (i = 0 ; i < size; i++) {
if (arr[i] > 0 )
System.out.println(i + 1 );
}
}
public static void main(String[] args)
{
int arr[] = { 7 , 3 , 4 , 5 , 5 , 6 , 2 };
int n = arr.length;
printTwoElements(arr, n);
}
}
|
Python3
def printTwoElements( arr, size):
for i in range (size):
if arr[ abs (arr[i]) - 1 ] > 0 :
arr[ abs (arr[i]) - 1 ] = - arr[ abs (arr[i]) - 1 ]
else :
print ( "The repeating element is " , abs (arr[i]))
for i in range (size):
if arr[i]> 0 :
print ( "and the missing element is " , i + 1 )
arr = [ 7 , 3 , 4 , 5 , 5 , 6 , 2 ]
n = len (arr)
printTwoElements(arr, n)
|
C#
using System;
class GFG {
static void printTwoElements( int [] arr, int size)
{
int i;
Console.Write( "The repeating element is " );
for (i = 0; i < size; i++) {
int abs_val = Math.Abs(arr[i]);
if (arr[abs_val - 1] > 0)
arr[abs_val - 1] = -arr[abs_val - 1];
else
Console.WriteLine(abs_val);
}
Console.Write( "and the missing element is " );
for (i = 0; i < size; i++) {
if (arr[i] > 0)
Console.WriteLine(i + 1);
}
}
public static void Main()
{
int [] arr = { 7, 3, 4, 5, 5, 6, 2 };
int n = arr.Length;
printTwoElements(arr, n);
}
}
|
PHP
<?php
function printTwoElements( $arr , $size )
{
$i ;
echo "The repeating element is" , " " ;
for ( $i = 0; $i < $size ; $i ++)
{
if ( $arr [ abs ( $arr [ $i ]) - 1] > 0)
$arr [ abs ( $arr [ $i ]) - 1] =
- $arr [ abs ( $arr [ $i ]) - 1];
else
echo ( abs ( $arr [ $i ]));
}
echo "\nand the missing element is " ;
for ( $i = 0; $i < $size ; $i ++)
{
if ( $arr [ $i ] > 0)
echo ( $i + 1);
}
}
$arr = array (7, 3, 4, 5, 5, 6, 2);
$n = count ( $arr );
printTwoElements( $arr , $n );
?>
|
Javascript
<script>
function printTwoElements(arr,size)
{
var i;
document.write( "The repeating element is " );
for (i = 0; i < size; i++)
{
var abs_value = Math.abs(arr[i]);
if (arr[abs_value - 1] > 0)
arr[abs_value - 1] = -arr[abs_value - 1];
else
document.write( abs_value);
}
document.write( "<br> and the missing element is " );
for (i = 0; i < size; i++)
{
if (arr[i] > 0)
document.write (i + 1);
}
}
arr = new Array ( 7, 3, 4, 5, 5, 6, 2 );
n = arr.length;
printTwoElements(arr, n);
</script>
|
OutputThe repeating element is 5
and the missing element is 1
Time Complexity: O(n)
Auxiliary Space: O(1) as it is using constant variables
Thanks to Manish Mishra for suggesting this method.
Method 4 (Make two equations)
Approach:
- Let x be the missing and y be the repeating element.
- Get the sum of all numbers using formula S = n(n+1)/2 – x + y
- Get product of all numbers using formula P = 1*2*3*…*n * y / x
- The above two steps give us two equations, we can solve the equations and get the values of x and y.
Time Complexity: O(n)
Thanks to disappearedng for suggesting this solution.
Note: This method can cause arithmetic overflow as we calculate the product and sum of all array elements.
Method 5 (Use XOR)
Approach:
- Let x and y be the desired output elements.
- Calculate the XOR of all the array elements.
xor1 = arr[0]^arr[1]^arr[2]…..arr[n-1]
- XOR the result with all numbers from 1 to n
xor1 = xor1^1^2^…..^n
- In the result xor1, all elements would nullify each other except x and y. All the bits that are set in xor1 will be set in either x or y. So if we take any set bit (We have chosen the rightmost set bit in code) of xor1 and divide the elements of the array in two sets – one set of elements with the same bit set and another set with the same bit not set. By doing so, we will get x in one set and y in another set. Now if we do XOR of all the elements in the first set, we will get x, and by doing the same in the other set we will get y.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void getTwoElements( int arr[], int n,
int * x, int * y)
{
int xor1;
int set_bit_no;
int i;
*x = 0;
*y = 0;
xor1 = arr[0];
for (i = 1; i < n; i++)
xor1 = xor1 ^ arr[i];
for (i = 1; i <= n; i++)
xor1 = xor1 ^ i;
set_bit_no = xor1 & ~(xor1 - 1);
for (i = 0; i < n; i++) {
if (arr[i] & set_bit_no)
*x = *x ^ arr[i];
else
*y = *y ^ arr[i];
}
for (i = 1; i <= n; i++) {
if (i & set_bit_no)
*x = *x ^ i;
else
*y = *y ^ i;
}
if (binary_search(arr,arr+n,y)) swap(x,y);
}
int main()
{
int arr[] = { 1, 3, 4, 5, 5, 6, 2 };
int * x = ( int *) malloc ( sizeof ( int ));
int * y = ( int *) malloc ( sizeof ( int ));
int n = sizeof (arr) / sizeof (arr[0]);
getTwoElements(arr, n, x, y);
cout << " The missing element is " << *x << " and the repeating"
<< " number is " << *y;
getchar ();
}
|
C
#include <stdio.h>
#include <stdlib.h>
void getTwoElements( int arr[], int n, int * x, int * y)
{
int xor1;
int set_bit_no;
int i;
*x = 0;
*y = 0;
xor1 = arr[0];
for (i = 1; i < n; i++)
xor1 = xor1 ^ arr[i];
for (i = 1; i <= n; i++)
xor1 = xor1 ^ i;
set_bit_no = xor1 & ~(xor1 - 1);
for (i = 0; i < n; i++) {
if (arr[i] & set_bit_no)
*x = *x ^ arr[i];
else
*y = *y ^ arr[i];
}
for (i = 1; i <= n; i++) {
if (i & set_bit_no)
*x = *x ^ i;
else
*y = *y ^ i;
}
}
int main()
{
int arr[] = { 1, 3, 4, 5, 5, 6, 2 };
int * x = ( int *) malloc ( sizeof ( int ));
int * y = ( int *) malloc ( sizeof ( int ));
int n = sizeof (arr) / sizeof (arr[0]);
getTwoElements(arr, n, x, y);
printf ( " The missing element is %d"
" and the repeating number"
" is %d" ,
*x, *y);
getchar ();
}
|
Java
import java.io.*;
class GFG {
static int x, y;
static void getTwoElements( int arr[], int n)
{
int xor1;
int set_bit_no;
int i;
x = 0 ;
y = 0 ;
xor1 = arr[ 0 ];
for (i = 1 ; i < n; i++)
xor1 = xor1 ^ arr[i];
for (i = 1 ; i <= n; i++)
xor1 = xor1 ^ i;
set_bit_no = xor1 & ~(xor1 - 1 );
for (i = 0 ; i < n; i++) {
if ((arr[i] & set_bit_no) != 0 )
x = x ^ arr[i];
else
y = y ^ arr[i];
}
for (i = 1 ; i <= n; i++) {
if ((i & set_bit_no) != 0 )
x = x ^ i;
else
y = y ^ i;
}
}
public static void main(String[] args)
{
int arr[] = { 1 , 3 , 4 , 5 , 1 , 6 , 2 };
int n = arr.length;
getTwoElements(arr, n);
System.out.println( " The missing element is "
+ x + "and the "
+ "repeating number is "
+ y);
}
}
|
Python3
def getTwoElements(arr, n):
global x, y
x = 0
y = 0
xor1 = arr[ 0 ]
for i in range ( 1 , n):
xor1 = xor1 ^ arr[i]
for i in range ( 1 , n + 1 ):
xor1 = xor1 ^ i
set_bit_no = xor1 & ~(xor1 - 1 )
for i in range (n):
if (arr[i] & set_bit_no) ! = 0 :
x = x ^ arr[i]
else :
y = y ^ arr[i]
for i in range ( 1 , n + 1 ):
if (i & set_bit_no) ! = 0 :
x = x ^ i
else :
y = y ^ i
arr = [ 1 , 3 , 4 , 5 , 5 , 6 , 2 ]
n = len (arr)
getTwoElements(arr, n)
print ( "The missing element is" , x,
"and the repeating number is" , y)
|
C#
using System;
class GFG {
static int x, y;
static void getTwoElements( int [] arr, int n)
{
int xor1;
int set_bit_no;
int i;
x = 0;
y = 0;
xor1 = arr[0];
for (i = 1; i < n; i++)
xor1 = xor1 ^ arr[i];
for (i = 1; i <= n; i++)
xor1 = xor1 ^ i;
set_bit_no = xor1 & ~(xor1 - 1);
for (i = 0; i < n; i++) {
if ((arr[i] & set_bit_no) != 0)
x = x ^ arr[i];
else
y = y ^ arr[i];
}
for (i = 1; i <= n; i++) {
if ((i & set_bit_no) != 0)
x = x ^ i;
else
y = y ^ i;
}
}
public static void Main()
{
int [] arr = { 1, 3, 4, 5, 1, 6, 2 };
int n = arr.Length;
getTwoElements(arr, n);
Console.Write( " The missing element is "
+ x + "and the "
+ "repeating number is "
+ y);
}
}
|
PHP
<?php
function getTwoElements(& $arr , $n )
{
$xor1 ;
$set_bit_no ;
$i ;
$x = 0;
$y = 0;
$xor1 = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$xor1 = $xor1 ^ $arr [ $i ];
for ( $i = 1; $i <= $n ; $i ++)
$xor1 = $xor1 ^ $i ;
$set_bit_no = $xor1 & ~( $xor1 - 1);
for ( $i = 0; $i < $n ; $i ++)
{
if (( $arr [ $i ] & $set_bit_no ) != 0)
$x = $x ^ $arr [ $i ];
else
$y = $y ^ $arr [ $i ];
}
for ( $i = 1; $i <= $n ; $i ++)
{
if (( $i & $set_bit_no ) != 0)
$x = $x ^ $i ;
else
$y = $y ^ $i ;
}
echo ( "The missing element is " . $x .
" and the repeating number is " . $y );
}
$arr = array ( 1, 3, 4, 5, 1, 6, 2 );
$n = sizeof( $arr );
getTwoElements( $arr , $n );
|
Javascript
let x, y;
function getTwoElements(arr, n)
{
let xor1;
let set_bit_no;
let i;
x = 0;
y = 0;
xor1 = arr[0];
for (i = 1; i < n; i++)
xor1 = xor1 ^ arr[i];
for (i = 1; i <= n; i++)
xor1 = xor1 ^ i;
set_bit_no = xor1 & ~(xor1 - 1);
for (i = 0; i < n; i++) {
if ((arr[i] & set_bit_no) != 0)
x = x ^ arr[i];
else
y = y ^ arr[i];
}
for (i = 1; i <= n; i++) {
if ((i & set_bit_no) != 0)
x = x ^ i;
else
y = y ^ i;
}
}
let arr = [ 1, 3, 4, 5, 1, 6, 2 ];
let n = arr.length;
getTwoElements(arr, n);
console.log( " The missing element is "
+ x + " and the "
+ "repeating number is "
+ y);
|
Time Complexity: O(n)
Auxiliary Space: O(1) as it is using constant space if the input array is excluded
This method doesn’t cause overflow, but it doesn’t tell which one occurs twice and which one is missing. We can add one more step that checks which one is missing and which one is repeating. This can be easily done in O(n) time.
Method 6 (Use a Map)
Approach:
This method involves creating a Hashtable with the help of Map. In this, the elements are mapped to their natural index. In this process, if an element is mapped twice, then it is the repeating element. And if an element’s mapping is not there, then it is the missing element.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int arr[] = { 4, 3, 6, 2, 1, 1 };
int n = 6;
unordered_map< int , bool > numberMap;
for ( int i : arr)
{
if (numberMap.find(i) ==
numberMap.end())
{
numberMap[i] = true ;
}
else
{
cout << "Repeating = " << i;
break ;
}
}
cout << endl;
for ( int i = 1; i <= n; i++)
{
if (numberMap.find(i) ==
numberMap.end())
{
cout << "Missing = " << i;
break ;
}
}
return 0;
}
|
Java
import java.util.*;
public class Test1 {
public static void main(String[] args)
{
int [] arr = { 4 , 3 , 6 , 2 , 1 , 1 };
Map<Integer, Boolean> numberMap
= new HashMap<>();
int max = arr.length;
for (Integer i : arr) {
if (numberMap.get(i) == null ) {
numberMap.put(i, true );
}
else {
System.out.println( "Repeating = " + i);
}
}
for ( int i = 1 ; i <= max; i++) {
if (numberMap.get(i) == null ) {
System.out.println( "Missing = " + i);
}
}
}
}
|
Python3
def main():
arr = [ 4 , 3 , 6 , 2 , 1 , 1 ]
numberMap = {}
max = len (arr)
for i in arr:
if not i in numberMap:
numberMap[i] = True
else :
print ( "Repeating =" , i)
for i in range ( 1 , max + 1 ):
if not i in numberMap:
print ( "Missing =" , i)
main()
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public static void Main(String[] args)
{
int [] arr = { 4, 3, 6, 2, 1, 1 };
Dictionary< int , Boolean> numberMap =
new Dictionary< int , Boolean>();
int max = arr.Length;
foreach ( int i in arr)
{
if (!numberMap.ContainsKey(i))
{
numberMap.Add(i, true );
}
else
{
Console.WriteLine( "Repeating = " + i);
}
}
for ( int i = 1; i <= max; i++)
{
if (!numberMap.ContainsKey(i))
{
Console.WriteLine( "Missing = " + i);
}
}
}
}
|
Javascript
<script>
let arr = [ 4, 3, 6, 2, 1, 1 ];
let n = 6;
let numberMap = new Map();
for (let i of arr)
{
if (numberMap.has(i) == false ) {
numberMap.set(i, true );
}
else
{
document.write( "Repeating = " ,i);
}
}
document.write( "</br>" );
for (let i = 1; i <= n; i++)
{
if (numberMap.has(i) == false ) {
document.write( "Missing = " ,i);
}
}
</script>
|
OutputRepeating = 1
Missing = 5
Time Complexity: O(N)
Auxiliary Space: O(N)
Method 7 (Make two equations using sum and sum of squares)
Approach:
- Let x be the missing and y be the repeating element.
- Let N is the size of the array.
- Get the sum of all numbers using the formula S = N(N+1)/2
- Get the sum of square of all numbers using formula Sum_Sq = N(N+1)(2N+1)/6
- Iterate through a loop from i=1….N
- S -= A[i]
- Sum_Sq -= (A[i]*A[i])
- It will give two equations
x-y = S – (1)
x^2 – y^2 = Sum_sq
x+ y = (Sum_sq/S) – (2)
C++
#include <bits/stdc++.h>
using namespace std;
vector< int >repeatedNumber( const vector< int > &A) {
long long int len = A.size();
long long int Sum_N = (len * (len+1) ) /2, Sum_NSq = (len * (len +1) *(2*len +1) )/6;
long long int missingNumber=0, repeating=0;
for ( int i=0;i<A.size(); i++){
Sum_N -= ( long long int )A[i];
Sum_NSq -= ( long long int )A[i]*( long long int )A[i];
}
missingNumber = (Sum_N + Sum_NSq/Sum_N)/2;
repeating= missingNumber - Sum_N;
vector < int > ans;
ans.push_back(repeating);
ans.push_back(missingNumber);
return ans;
}
int main( void ){
std::vector< int > v = {4, 3, 6, 2, 1, 6,7};
vector< int > res = repeatedNumber(v);
for ( int x: res){
cout<< x<< " " ;
}
cout<<endl;
}
|
Java
import java.util.*;
import java.math.BigInteger;
class GFG
{
static Vector<Integer> repeatedNumber( int [] a)
{
BigInteger n=BigInteger.valueOf(a.length);
BigInteger s=BigInteger.valueOf( 0 );
BigInteger ss=BigInteger.valueOf( 0 );
for ( int x : a)
{
s= s.add(BigInteger.valueOf(x));
ss= ss.add(BigInteger.valueOf(x).multiply(BigInteger.valueOf(x)));
}
BigInteger as= n.multiply(n.add(BigInteger.valueOf( 1 ))).divide(BigInteger.valueOf( 2 ));
BigInteger ass= as.multiply(BigInteger.valueOf( 2 ).multiply(n).add(BigInteger.valueOf( 1 ))).divide(BigInteger.valueOf( 3 ));
BigInteger sub=as.subtract(s);
BigInteger add=(ass.subtract(ss)).divide(sub);
int b = sub.add(add).divide(BigInteger.valueOf( 2 )).intValue();
int A = BigInteger.valueOf(b).subtract(sub).intValue();
Vector<Integer> ans = new Vector<>();
ans.add(A);
ans.add(b);
return ans;
}
public static void main(String[] args)
{
int [] v = { 4 , 3 , 6 , 2 , 1 , 6 , 7 };
Vector<Integer> res = repeatedNumber(v);
for ( int x : res)
{
System.out.print(x + " " );
}
}
}
|
Python3
def repeatedNumber(A):
length = len (A)
Sum_N = (length * (length + 1 )) / / 2
Sum_NSq = ((length * (length + 1 ) *
( 2 * length + 1 )) / / 6 )
missingNumber, repeating = 0 , 0
for i in range ( len (A)):
Sum_N - = A[i]
Sum_NSq - = A[i] * A[i]
missingNumber = (Sum_N + Sum_NSq / /
Sum_N) / / 2
repeating = missingNumber - Sum_N
ans = []
ans.append(repeating)
ans.append(missingNumber)
return ans
v = [ 4 , 3 , 6 , 2 , 1 , 6 , 7 ]
res = repeatedNumber(v)
for i in res:
print (i, end = " " )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static List< int > repeatedNumber( int [] A)
{
int len = A.Length;
int Sum_N = (len * (len + 1)) / 2;
int Sum_NSq = (len * (len + 1) *
(2 * len + 1)) / 6;
int missingNumber = 0, repeating = 0;
for ( int i = 0; i < A.Length; i++)
{
Sum_N -= A[i];
Sum_NSq -= A[i] * A[i];
}
missingNumber = (Sum_N + Sum_NSq /
Sum_N) / 2;
repeating = missingNumber - Sum_N;
List< int > ans = new List< int >();
ans.Add(repeating);
ans.Add(missingNumber);
return ans;
}
public static void Main(String[] args)
{
int [] v = { 4, 3, 6, 2, 1, 6, 7 };
List< int > res = repeatedNumber(v);
foreach ( int x in res)
{
Console.Write(x + " " );
}
}
}
|
Javascript
<script>
function repeatedNumber(A){
let length = A.length
let Sum_N = Math.floor((length * (length + 1)) / 2)
let Sum_NSq = Math.floor((length * (length + 1) * (2 * length + 1))/6)
let missingNumber = 0
let repeating = 0
for (let i=0;i<A.length;i++){
Sum_N -= A[i]
Sum_NSq -= A[i] * A[i]
}
missingNumber = Math.floor(Math.floor(Sum_N + Sum_NSq / Sum_N) / 2)
repeating = missingNumber - Sum_N
let ans = []
ans.push(repeating)
ans.push(missingNumber)
return ans
}
let v = [ 4, 3, 6, 2, 1, 6, 7 ]
let res = repeatedNumber(v)
for (let i of res)
document.write(i, " " )
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Thanks to Anish Shaha for suggesting this method.
Method 8 (Using OR Operator):
Approach:
Given an input array
- Performing OR operation on input array.
- At the same time checking if that number has occurred before, by determining if the position is already set or not. We will get the repeating number in this step.
- To find missing value we have to check the bit containing 0 using OR again.
C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector< int > arr = { 4, 3, 6, 2, 1, 1 };
int n = arr.size();
int bitOr = (1 << (arr[0] - 1));
int repeating, missing;
for ( int i = 1; i < n; i++) {
if ((bitOr | (1 << (arr[i] - 1))) == bitOr) {
repeating = arr[i];
continue ;
}
bitOr = (bitOr | (1 << (arr[i] - 1)));
}
for ( int i = 0; i < n; i++) {
if ((bitOr | (1 << i)) != bitOr) {
missing = i + 1;
break ;
}
}
cout << "Repeating : " << repeating
<< "\nMissing : " << missing;
return 0;
}
|
Java
import java.util.*;
class GFG{
public static void main(String[] args)
{
int [] arr = { 4 , 3 , 6 , 2 , 1 , 1 };
int n = arr.length;
int bitOr = ( 1 << (arr[ 0 ]- 1 ));
int repeating = 0 , missing = 0 ;
for ( int i= 1 ; i<n; i++){
if ((bitOr | ( 1 << (arr[i]- 1 ))) == bitOr) {
repeating = arr[i];
continue ;
}
bitOr = (bitOr | ( 1 << (arr[i]- 1 )));
}
for ( int i = 0 ; i < n; i++)
{
if ((bitOr | ( 1 << i)) != bitOr) {
missing = i+ 1 ;
break ;
}
}
System.out.print( "Repeating : " + repeating+ "\nMissing : " + missing);
}
}
|
Python3
class GFG:
def main(args):
arr = [ 4 , 3 , 6 , 2 , 1 , 1 ]
n = len (arr)
bitOr = ( 1 << (arr[ 0 ] - 1 ))
repeating = 0
missing = 0
for i in range ( 1 , n):
if ((bitOr | ( 1 << (arr[i] - 1 ))) = = bitOr):
repeating = arr[i]
continue
bitOr = (bitOr | ( 1 << (arr[i] - 1 )))
for i in range ( 1 , n):
if ((bitOr | ( 1 << i)) ! = bitOr):
missing = i + 1
break
print ( "Repeating : " + str (repeating) + "\nMissing : " + str (missing))
if __name__ = = "__main__" :
GFG.main([])
|
C#
using System;
public class GFG
{
public static void Main(String[] args)
{
int [] arr = { 4, 3, 6, 2, 1, 1 };
int n = arr.Length;
int bitOr = (1 << (arr[0] - 1));
int repeating = 0, missing = 0;
for ( int i = 1; i < n; i++) {
if ((bitOr | (1 << (arr[i] - 1))) == bitOr) {
repeating = arr[i];
continue ;
}
bitOr = (bitOr | (1 << (arr[i] - 1)));
}
for ( int i = 0; i < n; i++) {
if ((bitOr | (1 << i)) != bitOr) {
missing = i + 1;
break ;
}
}
Console.Write( "Repeating : " + repeating + "\nMissing : " + missing);
}
}
|
Javascript
<script>
let arr = [4, 3, 6, 2, 1, 1];
let n = arr.length;
let bitOr = (1 << (arr[0]-1));
let repeating = 0, missing = 0;
for (let i=1; i<n; i++){
if ((bitOr | (1 << (arr[i]-1))) == bitOr) {
repeating = arr[i];
continue ;
}
bitOr = (bitOr | (1 << (arr[i]-1)));
}
for (let i = 0; i < n; i++)
{
if ((bitOr | (1 << i)) != bitOr) {
missing = i+1;
break ;
}
}
document.write( "Repeating : " + repeating+ "<br/>" + "Missing : " + missing);
</script>
|
OutputRepeating : 1
Missing : 5
Time Complexity: O(n)
Auxiliary Space O(1)
Limitations of the approach: it only works on the size of array <= 64 if we use long and size of array <= 32
Method 9: (Placing every element in its correct position)
Approach: It is clear from the observation that if we sort an array, then arr[i] == i+1. If all elements in an array satisfy this condition, means this is an ideal case. So the idea is to sort the given array and traverse on it and check if arr[i] == i + 1 if so then increment i (because this element is at its correct position), otherwise, place this element (arr[i]) at its correct position (arr[arr[i] – 1) by swapping the arr[i] and arr[arr[i] -1]. This swapping will put the element arr[i] at its correct position (i.e arr[arr[i]-1]). After doing this operation gets over for all elements of the given array then again traverse over the array and check if arr[i] != i + 1 if so, then this is the duplicate element and i + 1 is the missing element.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
void getTwoElements( int arr[], int n)
{
int repeating(0), missing(0);
int i = 0;
while (i < n)
{
if (arr[i] == arr[arr[i] - 1])
i++;
else
swap(arr[i], arr[arr[i] - 1]);
}
for ( int i = 0; i < n; i++) {
if (arr[i] != i + 1) {
repeating = arr[i];
missing = i + 1;
break ;
}
}
cout << "Repeating: " << repeating << endl
<< "Missing: " << missing << endl;
}
int main()
{
int arr[] = { 2, 3, 1, 5, 1 };
int n = sizeof (arr) / sizeof ( int );
getTwoElements(arr, n);
return 0;
}
|
Java
import java.io.*;
public class Main {
static void swap( int [] arr, int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
static void getTwoElements( int [] arr, int n)
{
int repeating = 0 ;
int missing = 0 ;
int i = 0 ;
while (i < n) {
if (arr[i] == arr[arr[i] - 1 ]) {
i++;
}
else {
swap(arr, i, arr[i] - 1 );
}
}
for (i = 0 ; i < n; i++) {
if (arr[i] != i + 1 ) {
repeating = arr[i];
missing = i + 1 ;
break ;
}
}
System.out.println( "Repeating: " + repeating
+ "\nMissing: " + missing);
}
public static void main(String[] args)
{
int [] arr = { 2 , 3 , 1 , 5 , 1 };
int n = arr.length;
getTwoElements(arr, n);
}
}
|
Python3
def swap(arr, a, b):
temp = arr[a]
arr[a] = arr[b]
arr[b] = temp
def getTwoElements(arr, n):
repeating = 0
missing = 0
i = 0
while (i < n):
if (arr[i] = = arr[arr[i] - 1 ]):
i + = 1
else :
swap(arr, i, arr[i] - 1 )
for i in range (n):
if (arr[i] ! = i + 1 ):
repeating = arr[i]
missing = i + 1
break
print ( "Repeating:" , repeating)
print ( "Missing:" , missing)
arr = [ 2 , 3 , 1 , 5 , 1 ]
n = len (arr)
getTwoElements(arr, n)
|
C#
using System;
class GFG
{
static void swap( int [] arr, int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
static void getTwoElements( int [] arr, int n)
{
int repeating = 0;
int missing = 0;
int i = 0;
while (i < n)
{
if (arr[i] == arr[arr[i] - 1]) {
i++;
}
else
{
swap(arr, i, arr[i] - 1);
}
}
for (i = 0; i < n; i++)
{
if (arr[i] != i + 1) {
repeating = arr[i];
missing = i + 1;
break ;
}
}
Console.Write( "Repeating : " + repeating + "\nMissing : " + missing);
}
public static void Main(String[] args)
{
int [] arr = { 2, 3, 1, 5, 1 };
int n =arr.Length;
getTwoElements(arr,n);
}
}
|
Javascript
<script>
function swap(arr, a, b) {
let temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
function getTwoElements(arr, n) {
let repeating = 0;
let missing = 0;
let i = 0;
while (i < n) {
if (arr[i] == arr[arr[i] - 1]) {
i++;
}
else {
swap(arr, i, arr[i] - 1);
}
}
for (i = 0; i < n; i++) {
if (arr[i] != i + 1) {
repeating = arr[i];
missing = i + 1;
break ;
}
}
document.write( "Repeating: " + repeating + "<br>Missing: " + missing);
}
let arr = [2, 3, 1, 5, 1];
let n = arr.length;
getTwoElements(arr, n);
</script>
|
OutputRepeating: 1
Missing: 4
Time Complexity: O(n)
Auxiliary Space: O(1)
Please Login to comment...