Find position i to split Array such that prefix sum till i-1, i and suffix sum till i+1 are in GP with common ratio K
Last Updated :
24 Mar, 2022
Given an array, arr[] and a positive integer K. The task is to find the position say i of the element in arr[] such that prefix sum till i-1, i and suffix sum till i+1 are in Geometric Progression with common ratio K.
Examples:
Input: arr[] = { 5, 1, 4, 20, 6, 15, 9, 10 }, K = 2
Output: 4
Explanation: The following operations are performed to get required GP.
Sum of element from position 1 to 3 is 5 + 1 + 4 = 10 and from 5 to 8 is 6 + 15 + 9 + 10 = 40.
And element at position 4 is 20.
Therefore10, 20, 40 is a Geometric Progression series with common ratio K.
Input: arr[] ={ -3, 5, 0, 2, 1, 25, 25, 100 }, K = 5
Output: 6
Approach: The given problem can be solved by using Linear Search and basic prefix sum. Follow the steps below to solve the given problem.
- If the size of array is less than 3 then no sequence is possible so simply return -1.
- Initialize a variable say, arrSum to store sum of all elements of arr[].
- Calculate sum of array arr[] and store it in arrSum.
- if arrSum % R != 0, then return 0. Where R = K * K + 1 + K + 1.
- Initialize a variable say mid = K * (Sum / R) to store middle element of GP series with common ratio as K.
- Take a variable say temp to store temporary results.
- Iterate arr[] from index 1 to (size of arr[]) – 2 with variable i.
- temp = temp + arr[i-1]
- if arr[i] = mid
- if temp = mid/k, return (i+1) as the answer.
- else return 0.
- If loop terminates and no element in arr[] is equal to mid then simply return 0.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int checkArray( int arr[], int N, int k)
{
if (N < 3)
return -1;
int i, Sum = 0, temp = 0;
for (i = 0; i < N; i++)
Sum += arr[i];
int R = (k * k + k + 1);
if (Sum % R != 0)
return 0;
int Mid = k * (Sum / R);
for (i = 1; i < N - 1; i++) {
temp += arr[i - 1];
if (arr[i] == Mid) {
if (temp == Mid / k)
return i + 1;
else
return 0;
}
}
return 0;
}
int main()
{
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
import java.io.*;
class GFG {
static int checkArray( int arr[], int N, int k)
{
if (N < 3 )
return - 1 ;
int i, Sum = 0 , temp = 0 ;
for (i = 0 ; i < N; i++)
Sum += arr[i];
int R = (k * k + k + 1 );
if (Sum % R != 0 )
return 0 ;
int Mid = k * (Sum / R);
for (i = 1 ; i < N - 1 ; i++) {
temp += arr[i - 1 ];
if (arr[i] == Mid) {
if (temp == Mid / k)
return i + 1 ;
else
return 0 ;
}
}
return 0 ;
}
public static void main (String[] args) {
int arr[] = { 5 , 1 , 4 , 20 , 6 , 15 , 9 , 10 };
int N = arr.length;
int K = 2 ;
System.out.println(checkArray(arr, N, K));
}
}
|
Python3
def checkArray(arr, N, k):
if (N < 3 ):
return - 1
Sum = 0
temp = 0
for i in range ( 0 , N):
Sum + = arr[i]
R = (k * k + k + 1 )
if ( Sum % R ! = 0 ):
return 0
Mid = k * ( Sum / / R)
for i in range ( 1 , N - 1 ):
temp + = arr[i - 1 ]
if (arr[i] = = Mid):
if (temp = = Mid / / k):
return i + 1
else :
return 0
return 0
if __name__ = = "__main__" :
arr = [ 5 , 1 , 4 , 20 , 6 , 15 , 9 , 10 ]
N = len (arr)
K = 2
print (checkArray(arr, N, K))
|
C#
using System;
class GFG {
static int checkArray( int [] arr, int N, int k)
{
if (N < 3)
return -1;
int i, Sum = 0, temp = 0;
for (i = 0; i < N; i++)
Sum += arr[i];
int R = (k * k + k + 1);
if (Sum % R != 0)
return 0;
int Mid = k * (Sum / R);
for (i = 1; i < N - 1; i++) {
temp += arr[i - 1];
if (arr[i] == Mid) {
if (temp == Mid / k)
return i + 1;
else
return 0;
}
}
return 0;
}
public static void Main( string [] args)
{
int [] arr = { 5, 1, 4, 20, 6, 15, 9, 10 };
int N = arr.Length;
int K = 2;
Console.WriteLine(checkArray(arr, N, K));
}
}
|
Javascript
<script>
function checkArray(arr, N, k) {
if (N < 3)
return -1;
let i, Sum = 0, temp = 0;
for (i = 0; i < N; i++)
Sum += arr[i];
let R = (k * k + k + 1);
if (Sum % R != 0)
return 0;
let Mid = k * (Sum / R);
for (i = 1; i < N - 1; i++) {
temp += arr[i - 1];
if (arr[i] == Mid) {
if (temp == Mid / k)
return i + 1;
else
return 0;
}
}
return 0;
}
let arr = [5, 1, 4, 20, 6, 15, 9, 10];
let N = arr.length;
let K = 2;
document.write(checkArray(arr, N, K) + "<br>" );
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...