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

Given an array of n unique integers where each element in the array is in range [1, n]. The array has all distinct elements and size of 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 distinct
void 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 function
int 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;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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 distinct
def 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 function
if __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

chevron_right



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 numbers. 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 then avg. Two numbers can never be equal since all the given numbers are distinct.
  • We can find the first missing number as 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 as sum of natural numbers from avg+1 to n minus the sum of array elements greater than than avg

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

Sum of natural numbers from avg+1 to n
                                =  n*(n+1)/2 - avg*(avg+1)/2
                                =  6*7/2 - 3*4/2
                                =  15
Sum of array elements greater than average = 5 + 6 = 11
Second missing number = 15 - 11 = 4

Below is implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to find 2 Missing Numbers using O(1)
// extra space
#include <iostream>
using namespace std;
  
// Returns the sum of the array
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 distinct
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];
    }
  
    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;
    cout << (totalSmallerHalf - sumSmallerHalf) << " ";
  
    // The first (smaller) element = (sum of natural
    // numbers from avg+1 to n) - (sum of array elements
    // greater than avg)
    cout << (((n*(n+1))/2 - totalSmallerHalf) -
             sumGreaterHalf);
}
  
// Driver program to test above function
int 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to find 2 Missing
// Numbers using O(1) extra space
import java.io.*;
  
class GFG 
{
      
// Returns the sum of the array
static 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 distinct
static 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 Code
public 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 aj_36

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python Program to find 2 Missing 
# Numbers using O(1) extra space 
  
# Returns the sum of the array 
def 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 distinct 
def 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 Code
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 Yatin Gupta

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to find 2 Missing
// Numbers using O(1) extra space
using System;
  
class GFG
{
      
// Returns the sum of the array
static 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 distinct
static 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 Code 
static 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to find 2 Missing
// Numbers using O(1) extra space
  
// Returns the sum of the array
function 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 distinct
function 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
?>

chevron_right



Output :

Two Missing Numbers are
2 4

Note : There can be overflow issues in 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 contribute.geeksforgeeks.org or mail your article to contribute@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.



My Personal Notes arrow_drop_up



Article Tags :
Practice Tags :


3


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.