Check whether Arithmetic Progression can be formed from the given array

2.8

Given an array of n integers. The task is to check whether an arithmetic progression can be formed using all the given elements. If possible print “Yes”, else print “No”.

Examples:

Input : arr[] = {0, 12, 4, 8}
Output : Yes
Rearrange given array as {0, 4, 8, 12} 
which forms an arithmetic progression.

Input : arr[] = {12, 40, 11, 20}
Output : No

Method 1 (Simple)
A simple solution is to first find the smallest element, then find second smallest element and find the difference between these two. Let this difference be d. After finding the difference, find third smallest, fourth smallest and so on. After finding every i-th smallest smallest (from third onward), find the difference between value of current element and value of previous element. If difference is not same as d, return false. If all elements have same difference, return true. Time complexity of this solution is O(n2)

Method 2(Use Sorting)
The idea is to sort the given array. After sorting, check if differences between consecutive elements are same or not. If all differences are same, Arithmetic Progression is possible.

Below is C++ implementation of this approach:

// C++ program to check if a given array
// can form arithmetic progression
#include<bits/stdc++.h>
using namespace std;

// Returns true if a permutation of arr[0..n-1]
// can form arithmetic progression
bool checkIsAP(int arr[], int n)
{
  if (n == 1)
    return true;

  // Sort array
  sort(arr, arr + n);

  // After sorting, difference between
  // consecutive elements must be same.
  int d = arr[1] - arr[0];
  for (int i=2; i<n; i++)
    if (arr[i] - arr[i-1] != d)
      return false;

  return true;
}

// Driven Program
int main()
{
  int arr[] = { 20, 15, 5, 0, 10 };
  int n = sizeof(arr)/sizeof(arr[0]);

  (checkIsAP(arr, n))? (cout << "Yes" << endl) :
                       (cout << "No" << endl);

  return 0;
}

Output:

Yes

Time Complexity: O(n Log n).

Method 3(Use Hashing)

  1. Find out the smallest and second smallest elements
  2. Find different between the two elements. d = second_smallest – smallest
  3. Store all elements in a hashmap and return “NO” if duplicate element found (can be done together with step 1).
  4. Now start from “second smallest element + d” and one by one check n-2 terms of Arithmetic Progression in hashmap. If any value of progression is missing, return false.
  5. Return “YES” after end of the loop.

Time Complexity : O(n)
Auxiliary Space : O(n)

Thanks to Chenna Rao for suggesting this method,

 

Method 4(Using counting sort)
We can reduce space required in method 3 if given array can be modified.

  1. Find smallest and second smallest elements.
  2. Find d = second_smallest – smallest
  3. Subtract smallest element from all elements.
  4. Now if given array represent AP, all elements should be of form i*d where i varies from 0 to n-1.
  5. One by one divide all reduced elements with d. If any element is not divisible by d, return false.
  6. Now if array represents AP, it must be a permutation of numbers from 0 to n-1. We can easily check this using counting sort.

This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



2.8 Average Difficulty : 2.8/5.0
Based on 6 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.