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)