Given an array that represents elements of geometric progression in order. One element is missing in the progression, find the missing number. It may be assumed that one term is always missing and the missing term is not first or last of series.
Examples:
Input : arr[] = {1, 3 , 27, 81}
Output : 9
Input : arr[] = {4, 16, 64, 1024};
Output : 256
A Simple Solution is to linearly traverse the array and find the missing number. Time complexity of this solution is O(n).
An efficient solution to solve this problem in O(Log n) time using Binary Search. The idea is to go to the middle element. Check if the ratio of middle and next to middle is equal to common ratio or not, if not then the missing element lies between mid and mid+1. If the middle element is equal to n/2th term in Geometric Series (Let n be the number of elements in input array), then missing element lies in right half. Else element lies in left half.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int findMissingRec( int arr[], int low,
int high, int ratio)
{
if (low >= high)
return INT_MAX;
int mid = low + (high - low)/2;
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
if (arr[mid] == arr[0] * ( pow (ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
int findMissing( int arr[], int n)
{
int ratio = ( float ) pow (arr[n-1]/arr[0], 1.0/n);
return findMissingRec(arr, 0, n-1, ratio);
}
int main( void )
{
int arr[] = {2, 4, 8, 32};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << findMissing(arr, n);
return 0;
}
|
Java
class GFG {
public static int findMissingRec( int arr[], int low,
int high, int ratio)
{
if (low >= high)
return Integer.MAX_VALUE;
int mid = low + (high - low)/ 2 ;
if (arr[mid+ 1 ]/arr[mid] != ratio)
return (arr[mid] * ratio);
if ((mid > 0 ) && (arr[mid]/arr[mid- 1 ]) != ratio)
return (arr[mid- 1 ] * ratio);
if (arr[mid] == arr[ 0 ] * (Math.pow(ratio, mid)) )
return findMissingRec(arr, mid+ 1 , high, ratio);
return findMissingRec(arr, low, mid- 1 , ratio);
}
public static int findMissing( int arr[], int n)
{
int ratio =( int ) Math.pow(arr[n- 1 ]/arr[ 0 ], 1.0 /n);
return findMissingRec(arr, 0 , n- 1 , ratio);
}
public static void main(String[] args)
{
int arr[] = { 2 , 4 , 8 , 32 };
int n = arr.length;
System.out.print(findMissing(arr, n));
}
}
|
Python3
def findMissingRec(arr, low, high, ratio):
if (low > = high):
return 2147483647
mid = low + (high - low) / / 2
if (arr[mid + 1 ] / / arr[mid] ! = ratio):
return (arr[mid] * ratio)
if ((mid > 0 ) and (arr[mid] / arr[mid - 1 ]) ! = ratio):
return (arr[mid - 1 ] * ratio)
if (arr[mid] = = arr[ 0 ] * ( pow (ratio, mid)) ):
return findMissingRec(arr, mid + 1 , high, ratio)
return findMissingRec(arr, low, mid - 1 , ratio)
def findMissing(arr, n):
ratio = int ( pow (arr[n - 1 ] / arr[ 0 ], 1.0 / n))
return findMissingRec(arr, 0 , n - 1 , ratio)
arr = [ 2 , 4 , 8 , 32 ]
n = len (arr)
print (findMissing(arr, n))
|
C#
using System;
class GFG {
public static int findMissingRec( int []arr, int low,
int high, int ratio)
{
if (low >= high)
return int .MaxValue;
int mid = low + (high - low)/2;
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
if (arr[mid] == arr[0] * (Math.Pow(ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
public static int findMissing( int []arr, int n)
{
int ratio =( int ) Math.Pow(arr[n-1]/arr[0], 1.0/n);
return findMissingRec(arr, 0, n-1, ratio);
}
public static void Main()
{
int []arr = {2, 4, 8, 32};
int n = arr.Length;
Console.Write(findMissing(arr, n));
}
}
|
PHP
<?php
function findMissingRec(& $arr , $low ,
$high , $ratio )
{
if ( $low >= $high )
return PHP_INT_MAX;
$mid = $low + intval (( $high - $low ) / 2);
if ( $arr [ $mid +1]/ $arr [ $mid ] != $ratio )
return ( $arr [ $mid ] * $ratio );
if (( $mid > 0) && ( $arr [ $mid ] /
$arr [ $mid - 1]) != $ratio )
return ( $arr [ $mid - 1] * $ratio );
if ( $arr [ $mid ] == $arr [0] * (pow( $ratio , $mid )))
return findMissingRec( $arr , $mid + 1,
$high , $ratio );
return findMissingRec( $arr , $low ,
$mid - 1, $ratio );
}
function findMissing(& $arr , $n )
{
$ratio = (float) pow( $arr [ $n - 1] /
$arr [0], 1.0 / $n );
return findMissingRec( $arr , 0, $n - 1, $ratio );
}
$arr = array (2, 4, 8, 32);
$n = sizeof( $arr );
echo findMissing( $arr , $n );
?>
|
Javascript
<script>
function findMissingRec(arr,low,high,ratio)
{
if (low >= high)
return Integer.MAX_VALUE;
let mid = Math.floor(low + (high - low)/2);
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
if (arr[mid] == arr[0] * (Math.pow(ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
function findMissing(arr,n)
{
let ratio =Math.floor( Math.pow(arr[n-1]/arr[0], 1.0/n));
return findMissingRec(arr, 0, n-1, ratio);
}
let arr=[2, 4, 8, 32];
let n = arr.length;
document.write(findMissing(arr, n));
</script>
|
Time Complexity: O(logn)
Auxiliary Space: O(logn)
Note : Drawback with this solution are : For larger values or for bigger array, it may cause overflow and/or may take more time to computer powers.
This article is contributed by Yasin Zafar. 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.