📜  在几何级数中查找缺失的数字

📅  最后修改于: 2022-05-13 01:57:52.812000             🧑  作者: Mango

在几何级数中查找缺失的数字

给定一个按顺序表示几何级数元素的数组。进程中缺少一个元素,找到缺少的数字。可以假设总是缺少一个术语,并且缺少的术语不是系列的第一个或最后一个。
例子:

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