Longest arithmetic progression that can be formed with the given common difference d
Given an unsorted array a[] of size n and an integer d which is the common difference, the task is to find the length of the longest AP that can be formed for all j, greater than some i(<n),
if a[j] = a[i] + (j-i) * d
i.e. a[j] is in the AP of a[i] from index i to j.
Examples:
Input: n = 6, d = 2
arr[] = {1, 2, 5, 7, 9, 85}
Output: 4
The longest AP, taking indices into consideration, is [1, 5, 7, 9]
since 5 is 2 indices ahead of 1 and would fit in the AP if started
from index 0. as 5 = 1 + (2 – 0) * 2. So the output is 4.
Input: n = 10, d = 3
arr[] = {1, 4, 2, 5, 20, 11, 56, 100, 20, 23}
Output: 5
The longest AP, taking indices into consideration, is [2, 5, 11, 20, 23]
since 11 is 2 indices ahead of 5 and 20 is 3 indices ahead of 11. So they
would fit in the AP if started from index 2.
Naive Approach: For each element calculate the length of the longest AP it could form and print the maximum among them. It involves O(n2) time complexity.
An efficient approach is to use Hashing.
Create a map where the key is the starting element of an AP and its value is the number of elements in that AP. The idea is to update the value at key ‘a'(which is at index i and whose starting element is not yet there in the map) by 1 whenever the element at index j(>i) could be in the AP of ‘a'(as the starting element). Then we print the maximum value among all values in the map.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int maxlenAP( int * a, int n, int d)
{
unordered_map< int , int > m;
int maxt = 1;
for ( int i = 0; i < n; i++) {
m[a[i] - i * d]++;
}
for ( auto & it : m)
if (it.second > maxt)
maxt = it.second;
return maxt;
}
int main()
{
int n = 10, d = 3;
int a[10] = { 1, 4, 2, 5, 20, 11, 56, 100, 20, 23 };
cout << maxlenAP(a, n, d) << endl;
return 0;
}
|
Java
import java.io.*;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Map;
import java.lang.*;
class GFG
{
static int maxlenAP( int a[],
int n, int d)
{
HashMap<Integer, Integer> m =
new HashMap<Integer, Integer>();
int maxt = 1 ;
for ( int i = 0 ; i < n; i++)
{
if (m.containsKey(a[i] - i * d))
{
int freq = m.get(a[i] - i * d);
freq++;
m.put(a[i] - i * d, freq);
}
else
{
m.put(a[i] - i * d, 1 );
}
}
for (Entry<Integer, Integer> val: m.entrySet())
{
if (maxt < val.getValue())
maxt = val.getValue();
}
return maxt;
}
public static void main(String[] args)
{
int n = 10 , d = 3 ;
int a[] = new int []{ 1 , 4 , 2 , 5 , 20 , 11 ,
56 , 100 , 20 , 23 };
System.out.print(maxlenAP(a, n, d) + "\n" );
}
}
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int maxlenAP( int []a,
int n, int d)
{
Dictionary< int , int > m =
new Dictionary< int , int >();
int maxt = 1;
for ( int i = 0; i < n; i++)
{
if (m.ContainsKey(a[i] - i * d))
{
int freq = m[a[i] - i * d];
freq++;
m.Remove(a[i] - i * d);
m.Add(a[i] - i * d, freq);
}
else
{
m.Add(a[i] - i * d, 1);
}
}
foreach ( var val in m)
{
if (maxt < val.Value)
maxt = val.Value;
}
return maxt;
}
public static void Main(String[] args)
{
int n = 10, d = 3;
int []a = new int []{ 1, 4, 2, 5, 20, 11,
56, 100, 20, 23 };
Console.Write(maxlenAP(a, n, d) + "\n" );
}
}
|
Python 3
def maxlenAP(a, n, d):
m = dict ()
maxt = 1
for i in range (n):
if (a[i] - i * d) in m:
m[a[i] - i * d] + = 1
else :
m[a[i] - i * d] = 1
for it in m:
if m[it] > maxt:
maxt = m[it]
return maxt
if __name__ = = "__main__" :
n, d = 10 , 3
a = [ 1 , 4 , 2 , 5 , 20 , 11 , 56 , 100 , 20 , 23 ]
print (maxlenAP(a, n, d))
|
Javascript
<script>
function maxlenAP(a, n, d) {
let m = new Map();
let maxt = 1;
for (let i = 0; i < n; i++) {
if (m.has(a[i] - i * d)) {
m.set(a[i] - i * d, m.get(a[i] - i * d) + 1)
} else {
m.set(a[i] - i * d, 1)
}
}
for (let it of m)
if (it[1] > maxt)
maxt = it[1];
return maxt;
}
let n = 10, d = 3;
let a = [1, 4, 2, 5, 20, 11, 56, 100, 20, 23];
document.write(maxlenAP(a, n, d) + "<br>" );
</script>
|
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(n)
Last Updated :
26 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...