Minimum number of changes required to make the given array an AP

Given an array arr[] of N integers and a number d. You can change any element of the array to any integer. The task is to find the minimum number of change(s) required to make the given array an Arithmetic Progression with the common difference d.

Examples:

Input : N = 4, d = 2
        arr[] = {1, 2, 4, 6}
Output : 1
Explanation: change a[0]=0. 
So, new sequence is 0, 2, 4, 6 which is an AP.

Input : N = 5, d = 1
        arr[] = {1, 3, 3, 4, 6}
Output : 2
Explanation: change a[1]=2 and a[4]=5. 
So, new sequence is 1, 2, 3, 4, 5 which is an AP.


The idea to solve this problem is to observe that the formulae for n-th term in an AP is:

an = a0 + (n-1)*d

Where, a0 is the first term
and d is the common difference.

We are given the values of d and an. So, we will find the value of a0 for all values of i, where 1<=i<=n and store the frequency of occurrences of a0 for different values of i.

Now, the minimum number of elements needed to be changed is:

n - (maximum frequency of a0)

Where, maximum frequency of a0 signifies the total number of elements in the array for which the value of first term in the AP is same.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the minimum number
// of changes required to make the given
// array an AP with common difference d
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the minimum number
// of changes required to make the given
// array an AP with common difference d
int minimumChanges(int arr[], int n, int d)
{
    int maxFreq = INT_MIN;
      
    // Map to store frequency of a0
    unordered_map<int,int> freq;
      
    // storing frequency of a0 for all possible
    // values of a[i] and finding the maximum 
    // frequency
    for (int i = 0; i < n; ++i) {
        int a0 = arr[i] - (i)*d;
  
        // increment frequency by 1
        if(freq.find(a0)!=freq.end())
        {
            freq[a0]++;
        }
        else
            freq.insert(make_pair(a0,1));
  
        // finds count of most frequent number
        if (freq[a0] > maxFreq)
            maxFreq = freq[a0];
    }
      
    // minimum number of elements needed to 
    // be changed is: n - (maximum frequency of a0)
    return (n-maxFreq);
}
  
// Driver Program
int main()
{
    int n = 5, d = 1;
      
    int arr[] = { 1, 3, 3, 4, 6 };
      
    cout << minimumChanges(arr, n, d);
      
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the 
// minimum number of changes 
// required to make the given
// array an AP with common
// difference d
import java.util.*;
  
class GFG
{
  
// Function to find the minimum 
// number of changes required 
// to make the given array an 
// AP with common difference d
static int minimumChanges(int arr[],
                          int n, int d)
{
    int maxFreq = -1;
      
    // Map to store frequency of a0
    HashMap<Integer,
            Integer> freq = new HashMap<Integer,
                                        Integer>();
      
    // storing frequency of a0 for 
    // all possible values of a[i] 
    // and finding the maximum 
    // frequency
    for (int i = 0; i < n; ++i) 
    {
        int a0 = arr[i] - (i) * d;
  
        // increment frequency by 1
        if(freq.containsKey(a0))
        {
            freq.put(a0, freq.get(a0) + 1);
        }
        else
            freq.put(a0, 1);
  
        // finds count of most
        // frequent number
        if (freq.get(a0) > maxFreq)
            maxFreq = freq.get(a0);
    }
      
    // minimum number of elements 
    // needed to be changed is:
    // n - (maximum frequency of a0)
    return (n - maxFreq);
}
  
// Driver Code
public static void main(String args[])
{
    int n = 5, d = 1;
      
    int arr[] = { 1, 3, 3, 4, 6 };
      
    System.out.println(minimumChanges(arr, n, d));
}
}
  
// This code is contributed 
// by Arnab Kundu

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the minimum 
# number of changes required to make 
# the given array an AP with common 
# difference d 
  
# Function to find the minimum number 
# of changes required to make the given 
# array an AP with common difference d 
def minimumChanges(arr, n, d):
    maxFreq = -2147483648
      
    # dictionary to store 
    # frequency of a0
    freq = {}
      
    # storing frequency of a0 for 
    # all possible values of a[i] 
    # and finding the maximum'
    # frequency
    for i in range(n):
        a0 = arr[i] - i * d
          
        # increment frequency by 1
        if a0 in freq:
            freq[a0] += 1
        else:
            freq[a0] = 1
              
        # finds count of most 
        # frequent number
        if freq[a0] > maxFreq:
            maxFreq = freq[a0]
              
    # minimum number of elements 
    # needed to be changed is:
    # n - (maximum frequency of a0) 
    return (n-maxFreq)
  
# Driver Code
  
# number of terms in ap 
n = 5
  
# difference in AP
d = 1
arr = [1, 3, 3, 4, 6
ans = minimumChanges(arr, n, d)
print(ans)
  
# This code is contributed 
# by sahil shelangia

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to find the minimum number
// of changes required to make the given
// array an AP with common difference d
  
// Function to find the minimum number
// of changes required to make the given
// array an AP with common difference d
function minimumChanges(&$arr, $n, $d)
{
    $maxFreq = PHP_INT_MIN;
      
    // array to store frequency of a0
    $freq = array();
      
    // storing frequency of a0 for 
    // all possible values of a[i]
    // and finding the maximum 
    // frequency
    for ($i = 0; $i < $n; ++$i
    {
        $a0 = $arr[$i] - ($i) * $d;
  
        // increment frequency by 1
        if(array_search($a0, $freq))
        {
            $freq[$a0]++;
        }
        else
            $freq[$a0] = 1;
  
        // finds count of most 
        // frequent number
        if ($freq[$a0] > $maxFreq)
            $maxFreq = $freq[$a0];
    }
      
    // minimum number of elements 
    // needed to be changed is:
    // $n - (maximum frequency of a0)
    return ($n - $maxFreq);
}
  
// Driver Code
$n = 5;
$d = 1;
      
$arr = array( 1, 3, 3, 4, 6 );
      
echo minimumChanges($arr, $n, $d);
      
// This code is contributed
// by ChitraNayal
?>

chevron_right


Output:

2


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.