Maximize the common difference of an AP having the given array as a subsequence
Last Updated :
29 Nov, 2021
Given a sorted array arr[] consisting of N distinct elements, the task is to find the maximum possible common difference of an arithmetic progression such that the given array is a subsequence of that arithmetic progression.
Examples:
Input: arr[] = { 2, 4, 6, 8 }
Output: 2
Explanation:
Since arr[] is a subsequence of the arithmetic progression { 2, 4, 6, 8, 10, …}, the common difference of the arithmetic progression is 2.
Input: arr[] = { 2, 5, 11, 23 }
Output: 3
Explanation:
Since arr[] is a subsequence of the arithmetic progression { 2, 5, 8, 11, 14, …, 23, …}, the common difference of the arithmetic progression is 2.
Naive Approach: The simplest approach to solve this problem is to iterate over the range [(arr[N – 1] – arr[0]), 1] using variable CD(common difference) and for every value in the range, check if the given array can be a subsequent of an arithmetic progressions with the first element as arr[0] and the common difference as CD. This is possible by simply checking if the difference between every pair of adjacent array elements is divisible by CD or not. If found to be true, then print the value of CD as the maximum possible answer.
Time Complexity: O(N * (Maxm – Minm)), where Maxm and Minm are the last and first array elements respectively.
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized based on the following observations:
If arr[i] is Xth term and arr[0] is the first term of an arithmetic progression with common difference CD, then:
arr[i] = arr[0] + (X – 1) * CD
=> (arr[i] – arr[0]) = (X – 1) * CD
Therefore, the maximum possible common difference of the AP is the GCD of the absolute difference of each pair of adjacent array elements.
Follow the steps below to solve the problem:
Below is the implementation of the above approach
C++
#include <bits/stdc++.h>
using namespace std;
int MaxComDiffSubAP( int arr[], int N)
{
int maxCD = 0;
for ( int i = 0; i < N - 1; i++) {
maxCD = __gcd(maxCD,
arr[i + 1] - arr[i]);
}
return maxCD;
}
int main()
{
int arr[] = { 1, 3, 7, 9 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << MaxComDiffSubAP(arr, N);
return 0;
}
|
Java
class GFG
{
static int gcd( int a, int b)
{
if (a == 0 )
return b;
if (b == 0 )
return a;
if (a == b)
return a;
if (a > b)
return gcd(a - b, b);
return gcd(a, b - a);
}
static int MaxComDiffSubAP( int arr[], int N)
{
int maxCD = 0 ;
for ( int i = 0 ; i < N - 1 ; i++)
{
maxCD = gcd(maxCD,
arr[i + 1 ] - arr[i]);
}
return maxCD;
}
public static void main (String[] args)
{
int arr[] = { 1 , 3 , 7 , 9 };
int N = arr.length;
System.out.print(MaxComDiffSubAP(arr, N));
}
}
|
Python3
from math import gcd
def MaxComDiffSubAP(arr, N):
maxCD = 0
for i in range (N - 1 ):
maxCD = gcd(maxCD, arr[i + 1 ] - arr[i])
return maxCD
if __name__ = = '__main__' :
arr = [ 1 , 3 , 7 , 9 ]
N = len (arr)
print (MaxComDiffSubAP(arr, N))
|
C#
using System;
class GFG{
static int gcd( int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (a == b)
return a;
if (a > b)
return gcd(a - b, b);
return gcd(a, b - a);
}
static int MaxComDiffSubAP( int [] arr, int N)
{
int maxCD = 0;
for ( int i = 0; i < N - 1; i++)
{
maxCD = gcd(maxCD,
arr[i + 1] - arr[i]);
}
return maxCD;
}
public static void Main ()
{
int [] arr = { 1, 3, 7, 9 };
int N = arr.Length;
Console.WriteLine(MaxComDiffSubAP(arr, N));
}
}
|
Javascript
<script>
function gcd(a, b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (a == b)
return a;
if (a > b)
return gcd(a - b, b);
return gcd(a, b - a);
}
function MaxComDiffSubAP(arr, N)
{
let maxCD = 0;
for (let i = 0; i < N - 1; i++)
{
maxCD = gcd(maxCD,
arr[i + 1] - arr[i]);
}
return maxCD;
}
let arr = [ 1, 3, 7, 9 ];
let N = arr.length;
document.write(MaxComDiffSubAP(arr, N));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...