Find the only missing number in a sorted array
Last Updated :
13 Apr, 2021
You are given a sorted array of N integers from 1 to N with one number missing find the missing number Expected time complexity O(logn)
Examples:
Input :ar[] = {1, 3, 4, 5}
Output : 2
Input : ar[] = {1, 2, 3, 4, 5, 7, 8}
Output : 6
A simple solution is to linearly traverse the given array. Find the point where current element is not one more than previous.
An efficient solution is to use binary search. We use the index to search for the missing element and modified binary search. If element at mid != index+1 and this is first missing element then mid + 1 is the missing element. Else if this is not first missing element but ar[mid] != mid+1 search in left half. Else search in right half and if left>right then no element is missing.
C++
#include <iostream>
using namespace std;
int findmissing( int ar[], int N)
{
int l = 0, r = N - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (ar[mid] != mid + 1 &&
ar[mid - 1] == mid)
return mid + 1;
if (ar[mid] != mid + 1)
r = mid - 1;
else
l = mid + 1;
}
return -1;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 7, 8};
int N = sizeof (arr)/ sizeof (arr[0]);
cout << findmissing(arr, N);
return 0;
}
|
Java
class GFG
{
static int findmissing( int [] ar, int N)
{
int l = 0 , r = N - 1 ;
while (l <= r)
{
int mid = (l + r) / 2 ;
if (ar[mid] != mid + 1 &&
ar[mid - 1 ] == mid)
return (mid + 1 );
if (ar[mid] != mid + 1 )
r = mid - 1 ;
else
l = mid + 1 ;
}
return - 1 ;
}
public static void main(String [] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 7 , 8 };
int N = arr.length;
System.out.println(findmissing(arr, N));
}
}
|
Python3
def findmissing(ar, N):
l = 0
r = N - 1
while (l < = r):
mid = (l + r) / 2
mid = int (mid)
if (ar[mid] ! = mid + 1 and
ar[mid - 1 ] = = mid):
return (mid + 1 )
elif (ar[mid] ! = mid + 1 ):
r = mid - 1
else :
l = mid + 1
return ( - 1 )
def main():
ar = [ 1 , 2 , 3 , 4 , 5 , 7 , 8 ]
N = len (ar)
res = findmissing(ar, N)
print (res)
if __name__ = = "__main__" :
main()
|
C#
using System;
class GFG
{
static int findmissing( int []ar,
int N)
{
int l = 0, r = N - 1;
while (l <= r)
{
int mid = (l + r) / 2;
if (ar[mid] != mid + 1 &&
ar[mid - 1] == mid)
return (mid + 1);
if (ar[mid] != mid + 1)
r = mid - 1;
else
l = mid + 1;
}
return -1;
}
public static void Main()
{
int []arr = {1, 2, 3, 4, 5, 7, 8};
int N = arr.Length;
Console.WriteLine(findmissing(arr, N));
}
}
|
PHP
<?php
function findmissing(& $ar , $N )
{
$r = $N - 1;
$l = 0;
while ( $l <= $r )
{
$mid = ( $l + $r ) / 2;
if ( $ar [ $mid ] != $mid + 1 &&
$ar [ $mid - 1] == $mid )
return ( $mid + 1);
if ( $ar [ $mid ] != $mid + 1)
$r = $mid - 1;
else
$l = $mid + 1;
}
return (-1);
}
$ar = array (1, 2, 3, 4, 5, 7, 8);
$N = sizeof( $ar );
echo (findmissing( $ar , $N ));
?>
|
Javascript
<script>
function findmissing(ar, N) {
var l = 0,
r = N - 1;
while (l <= r) {
var mid = parseInt((l + r) / 2);
if (ar[mid] != mid + 1 && ar[mid - 1] == mid)
return mid + 1;
if (ar[mid] != mid + 1) r = mid - 1;
else l = mid + 1;
}
return -1;
}
var arr = [1, 2, 3, 4, 5, 7, 8];
var N = arr.length;
document.write(findmissing(arr, N));
</script>
|
Time Complexity:O(Log n)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...