Table of Contents
Problem Statement
Given two arrays A and B, one array is a duplicate of the other except one element. The one element is missing from either A or B. we need to find the lost element from a duplicated array.
Example
5 1 6 4 8 9 6 4 8 9
1
Approach 1
Algorithm
If elements are in the same order,
1. create a function FindMissingInB where the size of A is greater than the size of B which means the element is missing in B.
2. In FindMissingInB function:
- If there is only one element in array A, then that element is missing in B, return the element.
- If the first element and not equal in A and B then the first element itself is missing, return the first element of A.
- Else, initialize mid and low as the corner points of the array A and start the binary search in array A and get mid = (high + low)/2.
- If A[mid] = B[mid] then search for an element in the right part by making low as mid.
- Else, search for an element in the left part by making high as mid.
- End the loop, when low = high – 1 and return A[mid] which is the missing element.
3. Create a new function FindMissing with conditions:
- If Size of A = Size of B + 1, print FindMissingInB(A,B)
- If Size of B = Size of A + 1, print FindMissingInB(B,A)
- Else, invalid input.
4. call the function on the given two input arrays to print the missing number.
Implementation
C++ Program for Find the Lost Element From a Duplicated Array
#include <bits/stdc++.h> #include <stdio.h> #include <stdlib.h> using namespace std; //Function: //Using binary search approch in finding the missing element //where A[] is bigger array than B //Assuming the elements in same order in both A and B int FindMissingInB(int A[], int B[], int N) { //condition //only one element in A and B is empty if (N == 1) { return A[0]; } //condition //First element is missing // special case, for first element missing if (A[0] != B[0]) { return A[0]; } //condition //element is in between // Initialize low and high int low = 0,high = N - 1; while (low < high) { int mid = (low + high) / 2; //mid elements are equal then search in right subarray if (A[mid] == B[mid]) { low = mid; } else //mid elements are not eqaul { high = mid; } // end when low = high -1 if (low == high - 1) { break; } } //Missing element return A[high]; } //Checking conditions Size A > Size B or void FindMissing(int A[], int B[], int M, int N) { if (N == M-1) { cout << "Missing Element: "<< FindMissingInB(A, B, M) << endl; } else if (M == N-1) { cout << "Missing Element: "<< FindMissingInB(B, A, N) << endl; } else { cout << "Invalid!"<<endl; } } //Main Function int main() { int A[] = {1, 6, 4, 8, 9}; int B[] = {6, 4, 8, 9}; int M = sizeof(A)/sizeof(int); int N = sizeof(B)/sizeof(int); FindMissing(A, B, M, N); return 0; }
Missing Element: 1
Note: Assuming the elements in the same order in both A and B arrays.
Java Program for Find the Lost Element From a Duplicated Array
import java.util.Scanner; class sum { //Function: //Using binary search approch in finding the missing element //where A[] is bigger array than B //Assuming the elements in same order in both A and B public static int FindMissingInB(int A[], int B[], int N) { //condition //only one element in A and B is empty if (N == 1) { return A[0]; } //condition //First element is missing // special case, for first element missing if (A[0] != B[0]) { return A[0]; } //condition //element is in between // Initialize low and high int low = 0,high = N - 1; while (low < high) { int mid = (low + high) / 2; //mid elements are equal then search in right subarray if (A[mid] == B[mid]) { low = mid; } else //mid elements are not eqaul { high = mid; } // end when low = high -1 if (low == high - 1) { break; } } //Missing element return A[high]; } //Checking conditions Size A > Size B or public static void FindMissing(int A[], int B[], int M, int N) { if(N == M-1) { System.out.println("Missing Element: " + FindMissingInB(A, B, M)); } else if(M == N-1) { System.out.println("Missing Element: " + FindMissingInB(B, A, N)); } else { System.out.println("Invalid!"); } } public static void main(String[] args) { Scanner sr = new Scanner(System.in); int n = sr.nextInt(); int m = sr.nextInt(); int a[] = new int[n]; for(int i=0;i<n;i++) { a[i] = sr.nextInt(); } int b[] = new int[m]; for(int i=0;i<m;i++) { b[i] = sr.nextInt(); } FindMissing(a,b,n,m); } }
5 1 6 7 3 2 1 6 7 2
3
Complexity Analysis for Find the Lost Element From a Duplicated Array
Time Complexity
O(logn) where n is the size of the array. Here we apply a binary search which leads us to logn time complexity.
Space Complexity
O(1) because we use a few variables only to find the solution.
Approach 2
Algorithm
If elements in arrays are not in the same order,
1. we create a function FindMissing to find the missing element.
2. In this function:
- Initialize Missing_element = 0
- Use XOR on all the elements in the array with Missing_element
- Missing_element = Missing_element ^ A[i] or B[i] for all elements.
3. The final value of Missing_element is the missing lost element.
4. call the function on the given arrays to print the missing element.
C++ Program for Find the Lost Element From a Duplicated Array
#include <bits/stdc++.h> using namespace std; //using XOR on all the elements. void FindMissing(int A[], int B[], int M,int N) { if (M != N-1 && N != M-1) { cout << "Invalid!"; return; } int MissingElement = 0; for (int i=0; i<M; i++) { MissingElement = MissingElement^A[i]; } for (int i=0; i<N; i++) { MissingElement = MissingElement^B[i]; } cout << "Missing element: " << MissingElement; } //main function int main() { int A[] = {4, 1, 5, 9, 7}; int B[] = {7, 5, 9, 4}; int M = sizeof(A)/ sizeof(int); int N = sizeof(B)/ sizeof(int); FindMissing(A, B, M, N); return 0; }
Missing element: 1
Java Program for Find the Lost Element From a Duplicated Array
import java.util.Scanner; class sum { public static void FindMissing(int A[], int B[], int M,int N) { if (M != N-1 && N != M-1) { System.out.println("Invalid!"); return; } int MissingElement = 0; for (int i=0; i<M; i++) { MissingElement = MissingElement^A[i]; } for (int i=0; i<N; i++) { MissingElement = MissingElement^B[i]; } System.out.println("Missing element: " + MissingElement); } public static void main(String[] args) { Scanner sr = new Scanner(System.in); int n = sr.nextInt(); int m = sr.nextInt(); int a[] = new int[n]; for(int i=0;i<n;i++) { a[i] = sr.nextInt(); } int b[] = new int[m]; for(int i=0;i<m;i++) { b[i] = sr.nextInt(); } FindMissing(a,b,n,m); } }
3 2 1 2 3 1 2
3
Complexity Analysis for Find the Lost Element From a Duplicated Array
Time Complexity
O(n) where n is the size of the array. Here we traverse the array exactly one time which means the time complexity will be O(n).
Space Complexity
O(1) because we use a few variables only to find the solution.