在几何级数中查找缺失的数字
给定一个按顺序表示几何级数元素的数组。进程中缺少一个元素,找到缺少的数字。可以假设总是缺少一个术语,并且缺少的术语不是系列的第一个或最后一个。
例子:
Input : arr[] = {1, 3 , 27, 81}
Output : 9
Input : arr[] = {4, 16, 64, 1024};
Output : 256
一个简单的解决方案是线性遍历数组并找到丢失的数字。该解决方案的时间复杂度为 O(n)。
使用二分搜索在 O(Log n) 时间内解决此问题的有效解决方案。这个想法是去中间元素。检查middle和next to middle的比率是否等于共同比率,如果不是,则缺失的元素位于mid和mid+1之间。如果中间元素等于几何级数中的第 n/2 项(令 n 为输入数组中的元素数),则缺少的元素位于右半部分。其他元素位于左半部分。
C++
// C++ program to find missing number in
// geometric progression
#include
using namespace std;
// It returns INT_MAX in case of error
int findMissingRec(int arr[], int low,
int high, int ratio)
{
if (low >= high)
return INT_MAX;
int mid = low + (high - low)/2;
// If element next to mid is missing
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
// If element previous to mid is missing
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
// If missing element is in right half
if (arr[mid] == arr[0] * (pow(ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
// Find ration and calls findMissingRec
int findMissing(int arr[], int n)
{
// Finding ration assuming that the missing term is
// not first or last term of series.
int ratio = (float) pow(arr[n-1]/arr[0], 1.0/n);
return findMissingRec(arr, 0, n-1, ratio);
}
// Driver code
int main(void)
{
int arr[] = {2, 4, 8, 32};
int n = sizeof(arr)/sizeof(arr[0]);
cout << findMissing(arr, n);
return 0;
}
Java
// JAVA Code for Find the missing number
// in Geometric Progression
class GFG {
// It returns INT_MAX in case of error
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 element next to mid is missing
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
// If element previous to mid is missing
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
// If missing element is in right half
if (arr[mid] == arr[0] * (Math.pow(ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
// Find ration and calls findMissingRec
public static int findMissing(int arr[], int n)
{
// Finding ration assuming that the missing
// term is not first or last term of series.
int ratio =(int) Math.pow(arr[n-1]/arr[0], 1.0/n);
return findMissingRec(arr, 0, n-1, ratio);
}
/* Driver program to test above function */
public static void main(String[] args)
{
int arr[] = {2, 4, 8, 32};
int n = arr.length;
System.out.print(findMissing(arr, n));
}
}
// This code is contributed by Arnav Kr. Mandal.
Python3
# Python3 program to find missing
# number in geometric progression
# It returns INT_MAX in case of error
def findMissingRec(arr, low, high, ratio):
if (low >= high):
return 2147483647
mid = low + (high - low) // 2
# If element next to mid is missing
if (arr[mid + 1] // arr[mid] != ratio):
return (arr[mid] * ratio)
# If element previous to mid is missing
if ((mid > 0) and (arr[mid] / arr[mid-1]) != ratio):
return (arr[mid - 1] * ratio)
# If missing element is in right half
if (arr[mid] == arr[0] * (pow(ratio, mid)) ):
return findMissingRec(arr, mid+1, high, ratio)
return findMissingRec(arr, low, mid-1, ratio)
# Find ration and calls findMissingRec
def findMissing(arr, n):
# Finding ration assuming that
# the missing term is not first
# or last term of series.
ratio = int(pow(arr[n-1] / arr[0], 1.0 / n))
return findMissingRec(arr, 0, n-1, ratio)
# Driver code
arr = [2, 4, 8, 32]
n = len(arr)
print(findMissing(arr, n))
# This code is contributed by Anant Agarwal.
C#
// C# Code for Find the missing number
// in Geometric Progression
using System;
class GFG {
// It returns INT_MAX in case of error
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 element next to mid is missing
if (arr[mid+1]/arr[mid] != ratio)
return (arr[mid] * ratio);
// If element previous to mid is missing
if ((mid > 0) && (arr[mid]/arr[mid-1]) != ratio)
return (arr[mid-1] * ratio);
// If missing element is in right half
if (arr[mid] == arr[0] * (Math.Pow(ratio, mid)) )
return findMissingRec(arr, mid+1, high, ratio);
return findMissingRec(arr, low, mid-1, ratio);
}
// Find ration and calls findMissingRec
public static int findMissing(int []arr, int n)
{
// Finding ration assuming that the missing
// term is not first or last term of series.
int ratio =(int) Math.Pow(arr[n-1]/arr[0], 1.0/n);
return findMissingRec(arr, 0, n-1, ratio);
}
/* Driver program to test above function */
public static void Main()
{
int []arr = {2, 4, 8, 32};
int n = arr.Length;
Console.Write(findMissing(arr, n));
}
}
// This code is contributed by nitin mittal.
PHP
= $high)
return PHP_INT_MAX;
$mid = $low + intval(($high - $low) / 2);
// If element next to mid is missing
if ($arr[$mid+1]/$arr[$mid] != $ratio)
return ($arr[$mid] * $ratio);
// If element previous to mid is missing
if (($mid > 0) && ($arr[$mid] /
$arr[$mid - 1]) != $ratio)
return ($arr[$mid - 1] * $ratio);
// If missing element is in right half
if ($arr[$mid] == $arr[0] * (pow($ratio, $mid)))
return findMissingRec($arr, $mid + 1,
$high, $ratio);
return findMissingRec($arr, $low,
$mid - 1, $ratio);
}
// Find ration and calls findMissingRec
function findMissing(&$arr, $n)
{
// Finding ration assuming that the missing
// term is not first or last term of series.
$ratio = (float) pow($arr[$n - 1] /
$arr[0], 1.0 / $n);
return findMissingRec($arr, 0, $n - 1, $ratio);
}
// Driver code
$arr = array(2, 4, 8, 32);
$n = sizeof($arr);
echo findMissing($arr, $n);
// This code is contributed by ita_c
?>
Javascript
输出:
16