Removing a number from array to make it Geometric Progression - GeeksforGeeks
Given an array arr[] of N positive elements, the task is to find whether it is possible to convert this array into Geometric Progression (GP) by removing at-most one element. If yes, then find index of the number removing which converts the array into a geometric progression.
Special Cases :
1) If whole array is already in GP, then return any index.
2) If it is not possible to convert array into GP, then print "Not possible".
Read full article from Removing a number from array to make it Geometric Progression - GeeksforGeeks
Given an array arr[] of N positive elements, the task is to find whether it is possible to convert this array into Geometric Progression (GP) by removing at-most one element. If yes, then find index of the number removing which converts the array into a geometric progression.
Special Cases :
1) If whole array is already in GP, then return any index.
2) If it is not possible to convert array into GP, then print "Not possible".
Input : arr[] = [2, 4, 8, 24, 16, 32] Output : 3 Number to remove is arr[3], i.e., 24 After removing 24 array will be [2, 4, 8, 16, 32] which is a GP with starting value 2 and common ratio 2.
We can solve this problem by handling some special cases and then finding the pivot element, removing which makes array a GP. First we will check that our pivot element is first or second element, if not then the multiplier between them will be common ration of our GP, if yes then we found our solution.
Once we get common ratio of GP, we can check array element with this ratio, if this ratio violates at some index, then we skip this element and check from next index whether it is a continuation of previous GP or not.
In below code a method isGP is implemented which checks array to be GP after removing element at index ‘index’. This method is written for special case handling of first, second and last element.
Once we get common ratio of GP, we can check array element with this ratio, if this ratio violates at some index, then we skip this element and check from next index whether it is a continuation of previous GP or not.
In below code a method isGP is implemented which checks array to be GP after removing element at index ‘index’. This method is written for special case handling of first, second and last element.
// Utitilty method to compare two double values
bool
fEqual(
double
a,
double
b)
{
return
(
abs
(a - b) < EPS);
}
// Utility method to check, after deleting arr[ignore],
// remaining array is GP or not
bool
isGP(
double
arr[],
int
N,
int
ignore)
{
double
last = -1;
double
ratio = -1;
for
(
int
i = 0; i < N; i++)
{
// check ratio only if i is not ignore
if
(i != ignore)
{
// last will be -1 first time
if
(last != -1)
{
// ratio will be -1 at first time
if
(ratio == -1)
ratio = (
double
)arr[i] / last;
// if ratio is not constant return false
else
if
(!fEqual(ratio, (
double
)arr[i] / last))
return
false
;
}
last = arr[i];
}
}
return
true
;
}
// method return value removing which array becomes GP
int
makeGPbyRemovingOneElement(
double
arr[],
int
N)
{
/* solving special cases separately */
// Try removing first element
if
(isGP(arr, N, 0))
return
0;
// Try removing second element
if
(isGP(arr, N, 1))
return
1;
// Try removing last element
if
(isGP(arr, N, N-1))
return
(N-1);
/* now we know that first and second element will be
part of our GP so getting constant ratio of our GP */
double
ratio = (
double
)arr[1]/arr[0];
for
(
int
i = 2; i < N; i++)
{
if
(!fEqual(ratio, (
double
)arr[i]/arr[i-1]))
{
/* At this point, we know that elements from arr[0]
to arr[i-1] are in GP. So arr[i] is the element
removing which may make GP. We check if removing
arr[i] actually makes it GP or not. */
return
(isGP(arr+i-2, N-i+2, 2))? i : -1;
}
}
return
-1;
}