Find Two Missing Numbers | Set 1 (An Interesting Linear Time Solution) - GeeksforGeeks

26 Apr, 2021
Given an array of n unique integers where each element in the array is in the range [1, n]. The array has all distinct elements and the size of the array is (n-2). Hence Two numbers from the range are missing from this array. Find the two missing numbers.Examples :  
Input  : arr[] = {1, 3, 5, 6}
Output : 2 4

Input : arr[] = {1, 2, 4}
Output : 3 5

Input : arr[] = {1, 2}
Output : 3 4
 
 
Method 1 – O(n) time complexity and O(n) Extra Space
Step 1: Take a boolean array mark that keeps track of all the elements present in the array. Step 2: Iterate from 1 to n, check for every element if it is marked as true in the boolean array, if not then simply display that element. 
C++
Java
Python3
C#
Javascript
// C++ Program to find two Missing Numbers using O(n)// extra space#include <bits/stdc++.h>using namespace std; // Function to find two missing numbers in range// [1, n]. This function assumes that size of array// is n-2 and all array elements are distinctvoid findTwoMissingNumbers(int arr[], int n){    // Create a boolean vector of size n+1 and    // mark all present elements of arr[] in it.    vector<bool> mark(n+1, false);    for (int i = 0; i < n-2; i++)        mark[arr[i]] = true;     // Print two unmarked elements    cout << "Two Missing Numbers are\n";    for (int i = 1; i <= n; i++)       if (! mark[i])           cout << i << " ";     cout << endl;} // Driver program to test above functionint main(){    int arr[] = {1, 3, 5, 6};     // Range of numbers is 2 plus size of array    int n = 2 + sizeof(arr)/sizeof(arr[0]);     findTwoMissingNumbers(arr, n);     return 0;}
// Java Program to find two Missing Numbers using O(n)// extra spaceimport java.util.*; class GFG{ // Function to find two missing numbers in range// [1, n]. This function assumes that size of array// is n-2 and all array elements are distinctstatic void findTwoMissingNumbers(int arr[], int n){    // Create a boolean vector of size n+1 and    // mark all present elements of arr[] in it.    boolean []mark = new boolean[n+1];    for (int i = 0; i < n-2; i++)        mark[arr[i]] = true;     // Print two unmarked elements    System.out.println("Two Missing Numbers are");    for (int i = 1; i <= n; i++)    if (! mark[i])        System.out.print(i + " ");     System.out.println();} // Driver codepublic static void main(String[] args){    int arr[] = {1, 3, 5, 6};     // Range of numbers is 2 plus size of array    int n = 2 + arr.length;     findTwoMissingNumbers(arr, n);}} // This code is contributed by 29AjayKumar
# Python3 program to find two Missing Numbers using O(n)# extra space # Function to find two missing numbers in range# [1, n]. This function assumes that size of array# is n-2 and all array elements are distinctdef findTwoMissingNumbers(arr, n):    # Create a boolean vector of size n+1 and    # mark all present elements of arr[] in it.    mark = [False for i in range(n+1)]    for i in range(0,n-2,1):        mark[arr[i]] = True     # Print two unmarked elements    print("Two Missing Numbers are")    for i in range(1,n+1,1):        if (mark[i] == False):            print(i,end = " ")     print("\n") # Driver program to test above functionif __name__ == '__main__':    arr = [1, 3, 5, 6]     # Range of numbers is 2 plus size of array    n = 2 + len(arr)          findTwoMissingNumbers(arr, n); # This code is contributed by# Surendra_Gangwar
// C# Program to find two Missing Numbers// using O(n) extra spaceusing System;using System.Collections.Generic;     class GFG{ // Function to find two missing numbers in range// [1, n]. This function assumes that size of array// is n-2 and all array elements are distinctstatic void findTwoMissingNumbers(int []arr, int n){    // Create a boolean vector of size n+1 and    // mark all present elements of arr[] in it.    Boolean []mark = new Boolean[n + 1];    for (int i = 0; i < n - 2; i++)        mark[arr[i]] = true;     // Print two unmarked elements    Console.WriteLine("Two Missing Numbers are");    for (int i = 1; i <= n; i++)    if (! mark[i])        Console.Write(i + " ");     Console.WriteLine();} // Driver codepublic static void Main(String[] args){    int []arr = {1, 3, 5, 6};     // Range of numbers is 2 plus size of array    int n = 2 + arr.Length;     findTwoMissingNumbers(arr, n);}} // This code contributed by Rajput-Ji
<script>     // Javascript Program to find two    // Missing Numbers using O(n) extra space         // Function to find two missing numbers in range    // [1, n]. This function assumes that size of array    // is n-2 and all array elements are distinct    function findTwoMissingNumbers(arr, n)    {        // Create a boolean vector of size n+1 and        // mark all present elements of arr[] in it.        let mark = new Array(n+1);        for (let i = 0; i < n-2; i++)            mark[arr[i]] = true;         // Print two unmarked elements        document.write("Two Missing Numbers are" + "</br>");        for (let i = 1; i <= n; i++)            if (!mark[i])                document.write(i + " ");         document.write("</br>");    }         let arr = [1, 3, 5, 6];       // Range of numbers is 2 plus size of array    let n = 2 + arr.length;       findTwoMissingNumbers(arr, n); </script>
Output : 
Two Missing Numbers are
2 4
 
Method 2 – O(n) time complexity and O(1) Extra Space
The idea is based on this popular solution for finding one missing number. We extend the solution so that two missing elements are printed. Let’s find out the sum of 2 missing numbers: 
arrSum => Sum of all elements in the array

sum (Sum of 2 missing numbers) = (Sum of integers from 1 to n) - arrSum
                               = ((n)*(n+1))/2 – arrSum 

avg (Average of 2 missing numbers) = sum / 2;
 
One of the numbers will be less than or equal to avg while the other one will be strictly greater than avg. Two numbers can never be equal since all the given numbers are distinct.
We can find the first missing number as a sum of natural numbers from 1 to avg, i.e., avg*(avg+1)/2 minus the sum of array elements smaller than avg
We can find the second missing number by subtracting the first missing number from the sum of missing numbers
Consider an example for better clarification  
Input : 1 3 5 6, n = 6
Sum of missing integers = n*(n+1)/2 - (1+3+5+6) = 6.
Average of missing integers = 6/2 = 3.
Sum of array elements less than or equal to average = 1 + 3 = 4
Sum of natural numbers from 1 to avg = avg*(avg + 1)/2
                                     = 3*4/2 = 6
First missing number = 6 - 4 = 2
Second missing number = Sum of missing integers-First missing number
Second missing number = 6-2= 4
Below is the implementation of the above idea. 
C++
Java
Python3
C#
PHP
Javascript
// C++ Program to find 2 Missing Numbers using O(1)// extra space#include <iostream>using namespace std; // Returns the sum of the arrayint getSum(int arr[],int n){    int sum = 0;    for (int i = 0; i < n; i++)        sum += arr[i];    return sum;} // Function to find two missing numbers in range// [1, n]. This function assumes that size of array// is n-2 and all array elements are distinctvoid findTwoMissingNumbers(int arr[],int n){    // Sum of 2 Missing Numbers    int sum = (n*(n + 1)) /2 - getSum(arr, n-2);     // Find average of two elements    int avg = (sum / 2);     // Find sum of elements smaller than average (avg)    // and sum of elements greater than average (avg)    int sumSmallerHalf = 0, sumGreaterHalf = 0;    for (int i = 0; i < n-2; i++)    {        if (arr[i] <= avg)            sumSmallerHalf += arr[i];        else            sumGreaterHalf += arr[i];    }     cout << "Two Missing Numbers are\n";     // The first (smaller) element = (sum of natural    // numbers upto avg) - (sum of array elements    // smaller than or equal to avg)    int totalSmallerHalf = (avg*(avg + 1)) / 2;    int smallerElement = totalSmallerHalf - sumSmallerHalf;    cout << smallerElement << " ";     // The second (larger) element = (sum of both    // the elements) - smaller element    cout << sum - smallerElement;} // Driver program to test above functionint main(){    int arr[] = {1, 3, 5, 6};      // Range of numbers is 2 plus size of array    int n = 2 + sizeof(arr)/sizeof(arr[0]);      findTwoMissingNumbers(arr, n);      return 0;}
// Java Program to find 2 Missing// Numbers using O(1) extra spaceimport java.io.*; class GFG{     // Returns the sum of the arraystatic int getSum(int arr[], int n){    int sum = 0;    for (int i = 0; i < n; i++)        sum += arr[i];    return sum;} // Function to find two missing// numbers in range [1, n]. This// function assumes that size of// array is n-2 and all array// elements are distinctstatic void findTwoMissingNumbers(int arr[],                                  int n){    // Sum of 2 Missing Numbers    int sum = (n * (n + 1)) /               2 - getSum(arr, n - 2);     // Find average of two elements    int avg = (sum / 2);     // Find sum of elements smaller    // than average (avg) and sum of    // elements greater than average (avg)    int sumSmallerHalf = 0,        sumGreaterHalf = 0;    for (int i = 0; i < n - 2; i++)    {        if (arr[i] <= avg)            sumSmallerHalf += arr[i];        else            sumGreaterHalf += arr[i];    }     System.out.println("Two Missing " +                       "Numbers are");     // The first (smaller) element =    // (sum of natural numbers upto    // avg) - (sum of array elements    // smaller than or equal to avg)    int totalSmallerHalf = (avg *                           (avg + 1)) / 2;    System.out.println(totalSmallerHalf -                         sumSmallerHalf);     // The first (smaller) element =    // (sum of natural numbers from    // avg+1 to n) - (sum of array    // elements greater than avg)    System.out.println(((n * (n + 1)) / 2 -                        totalSmallerHalf) -                           sumGreaterHalf);} // Driver Codepublic static void main (String[] args){int arr[] = {1, 3, 5, 6};     // Range of numbers is 2// plus size of arrayint n = 2 + arr.length;     findTwoMissingNumbers(arr, n);}} // This code is contributed by aj_36
# Python Program to find 2 Missing# Numbers using O(1) extra space # Returns the sum of the arraydef getSum(arr,n):     sum = 0;    for i in range(0, n):        sum += arr[i]    return sum # Function to find two missing# numbers in range [1, n]. This# function assumes that size of# array is n-2 and all array# elements are distinctdef findTwoMissingNumbers(arr, n):     # Sum of 2 Missing Numbers    sum = ((n * (n + 1)) / 2 -           getSum(arr, n - 2));     #Find average of two elements    avg = (sum / 2);     # Find sum of elements smaller    # than average (avg) and sum    # of elements greater than    # average (avg)    sumSmallerHalf = 0    sumGreaterHalf = 0;    for i in range(0, n - 2):             if (arr[i] <= avg):            sumSmallerHalf += arr[i]        else:            sumGreaterHalf += arr[i]         print("Two Missing Numbers are")     # The first (smaller) element = (sum    # of natural numbers upto avg) - (sum    # of array elements smaller than or    # equal to avg)    totalSmallerHalf = (avg * (avg + 1)) / 2    print(str(totalSmallerHalf -              sumSmallerHalf) + " ")     # The first (smaller) element = (sum    # of natural numbers from avg+1 to n) -    # (sum of array elements greater than avg)    print(str(((n * (n + 1)) / 2 -               totalSmallerHalf) -               sumGreaterHalf)) # Driver Codearr = [1, 3, 5, 6]     # Range of numbers is 2# plus size of arrayn = 2 + len(arr)     findTwoMissingNumbers(arr, n) # This code is contributed# by Yatin Gupta
// C# Program to find 2 Missing// Numbers using O(1) extra spaceusing System; class GFG{     // Returns the sum of the arraystatic int getSum(int []arr, int n){    int sum = 0;    for (int i = 0; i < n; i++)        sum += arr[i];    return sum;} // Function to find two missing// numbers in range [1, n]. This// function assumes that size of// array is n-2 and all array// elements are distinctstatic void findTwoMissingNumbers(int []arr,                                  int n){    // Sum of 2 Missing Numbers    int sum = (n * (n + 1)) / 2 -              getSum(arr, n - 2);     // Find average of two elements    int avg = (sum / 2);     // Find sum of elements smaller    // than average (avg) and sum of    // elements greater than average (avg)    int sumSmallerHalf = 0,        sumGreaterHalf = 0;    for (int i = 0; i < n - 2; i++)    {        if (arr[i] <= avg)            sumSmallerHalf += arr[i];        else            sumGreaterHalf += arr[i];    }     Console.WriteLine("Two Missing " +                      "Numbers are ");     // The first (smaller) element =    // (sum of natural numbers upto    // avg) - (sum of array elements    // smaller than or equal to avg)    int totalSmallerHalf = (avg *                           (avg + 1)) / 2;    Console.WriteLine(totalSmallerHalf -                        sumSmallerHalf);     // The first (smaller) element =    // (sum of natural numbers from    // avg+1 to n) - (sum of array    // elements greater than avg)    Console.WriteLine(((n * (n + 1)) / 2 -                        totalSmallerHalf) -                        sumGreaterHalf);} // Driver Codestatic public void Main (){    int []arr = {1, 3, 5, 6};         // Range of numbers is 2    // plus size of array    int n = 2 + arr.Length;         findTwoMissingNumbers(arr, n);}} // This code is contributed by ajit
<?php// PHP Program to find 2 Missing// Numbers using O(1) extra space // Returns the sum of the arrayfunction getSum($arr, $n){    $sum = 0;    for ($i = 0; $i < $n; $i++)        $sum += $arr[$i];    return $sum;} // Function to find two missing// numbers in range [1, n]. This// function assumes that size of// array is n-2 and all array// elements are distinctfunction findTwoMissingNumbers($arr, $n){    // Sum of 2 Missing Numbers    $sum = ($n * ($n + 1)) /2 -            getSum($arr, $n - 2);     // Find average of two elements    $avg = ($sum / 2);     // Find sum of elements smaller    // than average (avg) and sum of    // elements greater than average (avg)    $sumSmallerHalf = 0;    $sumGreaterHalf = 0;    for ($i = 0; $i < $n - 2; $i++)    {        if ($arr[$i] <= $avg)            $sumSmallerHalf += $arr[$i];        else            $sumGreaterHalf += $arr[$i];    }     echo "Two Missing Numbers are\n";     // The first (smaller) element =    // (sum of natural numbers upto avg) -    // (sum of array elements smaller    // than or equal to avg)    $totalSmallerHalf = ($avg * ($avg + 1)) / 2;    echo ($totalSmallerHalf -          $sumSmallerHalf) , " ";     // The first (smaller) element =    // (sum of natural numbers from avg +    // 1 to n) - (sum of array elements    // greater than avg)    echo ((($n * ($n + 1)) / 2 - $totalSmallerHalf) -                                 $sumGreaterHalf);} // Driver Code$arr= array (1, 3, 5, 6); // Range of numbers is// 2 plus size of array$n = 2 + sizeof($arr); findTwoMissingNumbers($arr, $n); // This code is contributed by aj_36?>
<script>     // Javascript Program to find 2 Missing    // Numbers using O(1) extra space         // Returns the sum of the array    function getSum(arr, n)    {        let sum = 0;        for (let i = 0; i < n; i++)            sum += arr[i];        return sum;    }     // Function to find two missing    // numbers in range [1, n]. This    // function assumes that size of    // array is n-2 and all array    // elements are distinct    function findTwoMissingNumbers(arr, n)    {        // Sum of 2 Missing Numbers        let sum = (n * (n + 1)) / 2 -        getSum(arr, n - 2);         // Find average of two elements        let avg = (sum / 2);         // Find sum of elements smaller        // than average (avg) and sum of        // elements greater than average (avg)        let sumSmallerHalf = 0,        sumGreaterHalf = 0;        for (let i = 0; i < n - 2; i++)        {            if (arr[i] <= avg)                sumSmallerHalf += arr[i];            else                sumGreaterHalf += arr[i];        }         document.write(        "Two Missing " + "Numbers are " + "</br>"        );         // The first (smaller) element =        // (sum of natural numbers upto        // avg) - (sum of array elements        // smaller than or equal to avg)        let totalSmallerHalf = (avg * (avg + 1)) / 2;        document.write(        (totalSmallerHalf - sumSmallerHalf) + " "        );         // The first (smaller) element =        // (sum of natural numbers from        // avg+1 to n) - (sum of array        // elements greater than avg)        document.write(        ((n * (n + 1)) / 2 - totalSmallerHalf) -        sumGreaterHalf + "</br>"        );    }         let arr = [1, 3, 5, 6];          // Range of numbers is 2    // plus size of array    let n = 2 + arr.length;          findTwoMissingNumbers(arr, n); </script>
Output : 
Two Missing Numbers are
2 4
Note: There can be overflow issues in the above solution. In below set 2, another solution that is O(n) time, O(1) space, and doesn’t cause overflow issues is discussed.Find Two Missing Numbers | Set 2 (XOR based solution)This article is contributed by Chirag Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
jit_t
YatinGupta
SURENDRA_GANGWAR
RaoRajkumar
29AjayKumar
Rajput-Ji
divyeshrabadiya07
mukesh07
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Linked List vs Array
Python | Using 2D arrays/lists the right way
Maximum and minimum of an array using minimum number of comparisons
Given an array of size n and a number k, find all elements that appear more than n/k times