📌  相关文章
📜  找到位置 i 来拆分 Array,使得直到 i-1 的前缀总和,直到 i+1 的后缀总和在 GP 中,共同比率为 K

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

找到位置 i 来拆分 Array,使得直到 i-1 的前缀总和,直到 i+1 的后缀总和在 GP 中,共同比率为 K

给定一个数组arr[]和一个正整数K 。任务是找到arr[]中元素的位置 say i ,使得前缀总和直到i-1i和后缀总和直到i+1在几何级数中,具有共同比率K

例子

方法:给定的问题可以通过使用线性搜索和基本前缀和来解决。请按照以下步骤解决给定的问题。

  • 如果数组的大小小于 3,则不可能有序列,因此只需返回 -1。
  • 初始化一个变量,比如arrSum以存储arr[]的所有元素的总和。
  • 计算数组arr[]的总和并将其存储在arrSum中。
  • 如果arrSum % R != 0 ,则返回0 。其中R = K * K + 1 + K + 1
  • 初始化一个变量mid = K * (Sum / R)以存储 GP 系列的中间元素,其公比为K。
  • 取一个变量说temp来存储临时结果。
  • 使用变量iarr[]从索引1迭代到 ( arr[] 的大小) – 2
    • 温度 = 温度 + arr[i-1]
    • 如果arr[i] = 中
      • 如果temp = mid/k ,则返回(i+1)作为答案。
      • 否则返回0
  • 如果循环终止并且arr[]中没有元素等于 mid 然后简单地返回0

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to check if there is
// an element forming G.P. series
// having common ratio k
int checkArray(int arr[], int N, int k)
{
 
    // If size of array is less than
    // three then return -1
    if (N < 3)
        return -1;
 
    // Initialize the variables
    int i, Sum = 0, temp = 0;
 
    // Calculate total sum of array
    for (i = 0; i < N; i++)
        Sum += arr[i];
 
    int R = (k * k + k + 1);
 
    if (Sum % R != 0)
        return 0;
 
    // Calculate Middle element of G.P. series
    int Mid = k * (Sum / R);
 
    // Iterate over the range
    for (i = 1; i < N - 1; i++) {
 
        // Store the first element of G.P.
        // series in the variable temp
        temp += arr[i - 1];
 
        if (arr[i] == Mid) {
 
            // Return position of middle element
            // of the G.P. series if the first
            // element is in G.P. of common ratio k
            if (temp == Mid / k)
                return i + 1;
 
            // Else return 0
            else
                return 0;
        }
    }
 
    // if middle element is not found in arr[]
    return 0;
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 5, 1, 4, 20, 6, 15, 9, 10 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    int K = 2;
 
    cout << checkArray(arr, N, K) << endl;
 
    return 0;
}


Java
// Java program for the above approach
 
import java.io.*;
 
class GFG {
   
// Function to check if there is
// an element forming G.P. series
// having common ratio k
static int checkArray(int arr[], int N, int k)
{
 
    // If size of array is less than
    // three then return -1
    if (N < 3)
        return -1;
 
    // Initialize the variables
    int i, Sum = 0, temp = 0;
 
    // Calculate total sum of array
    for (i = 0; i < N; i++)
        Sum += arr[i];
 
    int R = (k * k + k + 1);
 
    if (Sum % R != 0)
        return 0;
 
    // Calculate Middle element of G.P. series
    int Mid = k * (Sum / R);
 
    // Iterate over the range
    for (i = 1; i < N - 1; i++) {
 
        // Store the first element of G.P.
        // series in the variable temp
        temp += arr[i - 1];
 
        if (arr[i] == Mid) {
 
            // Return position of middle element
            // of the G.P. series if the first
            // element is in G.P. of common ratio k
            if (temp == Mid / k)
                return i + 1;
 
            // Else return 0
            else
                return 0;
        }
    }
 
    // if middle element is not found in arr[]
    return 0;
}
 
// Driver Code
public static void main (String[] args) {
   
    // Given array
    int arr[] = { 5, 1, 4, 20, 6, 15, 9, 10 };
 
    int N = arr.length;
 
    int K = 2;
 
       System.out.println(checkArray(arr, N, K));
}
}
 
// This code is contributed by Dharanendra L V.


Python3
# python program for the above approach
 
# Function to check if there is
# an element forming G.P. series
# having common ratio k
def checkArray(arr, N, k):
 
        # If size of array is less than
        # three then return -1
    if (N < 3):
        return -1
 
        # Initialize the variables
    Sum = 0
    temp = 0
 
    # Calculate total sum of array
    for i in range(0, N):
        Sum += arr[i]
 
    R = (k * k + k + 1)
 
    if (Sum % R != 0):
        return 0
 
        # Calculate Middle element of G.P. series
    Mid = k * (Sum // R)
 
    # Iterate over the range
    for i in range(1, N-1):
 
                # Store the first element of G.P.
                # series in the variable temp
        temp += arr[i - 1]
 
        if (arr[i] == Mid):
 
                        # Return position of middle element
                        # of the G.P. series if the first
                        # element is in G.P. of common ratio k
            if (temp == Mid // k):
                return i + 1
 
                # Else return 0
            else:
                return 0
 
        # if middle element is not found in arr[]
    return 0
 
# Driver Code
if __name__ == "__main__":
 
    # Given array
    arr = [5, 1, 4, 20, 6, 15, 9, 10]
    N = len(arr)
    K = 2
 
    print(checkArray(arr, N, K))
 
    # This code is contributed by rakeshsahni


C#
// C# program for the above approach
using System;
class GFG {
 
    // Function to check if there is
    // an element forming G.P. series
    // having common ratio k
    static int checkArray(int[] arr, int N, int k)
    {
 
        // If size of array is less than
        // three then return -1
        if (N < 3)
            return -1;
 
        // Initialize the variables
        int i, Sum = 0, temp = 0;
 
        // Calculate total sum of array
        for (i = 0; i < N; i++)
            Sum += arr[i];
 
        int R = (k * k + k + 1);
 
        if (Sum % R != 0)
            return 0;
 
        // Calculate Middle element of G.P. series
        int Mid = k * (Sum / R);
 
        // Iterate over the range
        for (i = 1; i < N - 1; i++) {
 
            // Store the first element of G.P.
            // series in the variable temp
            temp += arr[i - 1];
 
            if (arr[i] == Mid) {
 
                // Return position of middle element
                // of the G.P. series if the first
                // element is in G.P. of common ratio k
                if (temp == Mid / k)
                    return i + 1;
 
                // Else return 0
                else
                    return 0;
            }
        }
 
        // if middle element is not found in arr[]
        return 0;
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
 
        // Given array
        int[] arr = { 5, 1, 4, 20, 6, 15, 9, 10 };
 
        int N = arr.Length;
 
        int K = 2;
 
        Console.WriteLine(checkArray(arr, N, K));
    }
}
 
// This code is contributed by ukasp.


Javascript


输出
4

时间复杂度:O(N)
辅助空间:O(1)