Wednesday, May 22, 2013

Finding the missing element in an array:

An array of size (n-1) contains all the numbers in the range [1..n] except one number which is missing. Write a program to find the missing number in O(n) time and O(1) space.

For example let N= 5 and the input array is [1,3,4,5], the output should be 2.

Given O(n) space we can always maintain a boolean array of size n to store a flag for each number if it is present or not. Here the restriction is to use constant extra space.

Two methods are discussed here.

Method#1:
Find sum of all the elements in given array. Let it be sum1. Find the sum of numbers from 1 to n. It would be
n*(n+1)/2 (remember Arithmetic Progression from your school mathematics?) let it be sum2. Now subtracting sum1 from sum2 ( sum2-sum1) gives the required result.
Method#2:
Find XOR of all the elements in the array, let it be ax. Find XOR of elements from
[1..n], let it be nx. Then performing XOR between these two gives the missing number

The following C++ code shows the implementation of both the methods stated above. Both algorithms run in O(n) time and O(1) space complexity.





#include <iostream>
using namespace std;
//array contains n-1 numbers, this method finds
//the nth number missing.
int findMissingNum(int *array, int n)
{
 //sum of first n numbers 1...n
 int nSum = n*(n+1)/2;
 //find array sum
 int arSum = 0;
 for( int i = 0 ; i < n-1 ; i++)
 {
  arSum += array[i];
 }
 // difference between two sum, gives the missing number
 return nSum - arSum;
}

int findMissingNumXor(int *array,int n)
{
 int nXor; //XOR of 1..N elements
 int arXor; //XOR of array elements
 int i;
 //find XOR of 1 to n elements
 for( i = 0 ; i < n ;i++)
 {
  nXor = nXor ^ (i+1);
 }
 //find XOR of array elements
 for( i = 0 ; i < n-1 ; i++)
 {
  arXor = arXor ^array[i];
 }
 //XOR of two gives the result
 return nXor ^arXor;
}
int main()
{
 int *array;
 int n;
 cin>>n;
 //allocate memory for n-1 numbers
 array = new int[n-1];
 int i;
 //read n-1 numbers as input
 for( i = 0; i < n-1; i++)
 {
  cin>>array[i];  
 }
 
 cout<<findMissingNumXor(array,n);
 //deallocate dynamic memory
 delete[] array;
 return 0;
}