Related Articles
Find minimum changes required in an array for it to contain k distinct elements
• Difficulty Level : Easy
• Last Updated : 26 Aug, 2019

Given an array arr of size N and a number K. The task is to find the minimum elements to be replaced in the array with any number such that the array consists of K distinct elements.

Note: The array might consist of repeating elements.
Examples:

Input : arr[]={1, 2, 2, 8}, k = 1
Output : 2
The elements to be changed are 1, 8

Input : arr[]={1, 2, 7, 8, 2, 3, 2, 3}, k = 2
Output : 3
The elements to be changed are 1, 7, 8

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Since the task is to replace minimum elements from the array so we won’t replace elements which have more frequency in the array. So just define an array freq[] which stores the frequency of each number present in the array arr, then sort freq in descending order. So, first k elements of freq array don’t need to be replaced.

Below is the implementation of the above approach :

## C++

 `// CPP program to minimum changes required ``// in an array for k distinct elements.``#include ``using` `namespace` `std;`` ` `#define MAX 100005`` ` `// Function to minimum changes required ``// in an array for k distinct elements.``int` `Min_Replace(``int` `arr[], ``int` `n, ``int` `k)``{``    ``sort(arr, arr + n);`` ` `    ``// Store the frequency of each element``    ``int` `freq[MAX];``     ` `    ``memset``(freq, 0, ``sizeof` `freq);``     ` `    ``int` `p = 0;``    ``freq[p] = 1;``     ` `    ``// Store the frequency of elements``    ``for` `(``int` `i = 1; i < n; i++) {``        ``if` `(arr[i] == arr[i - 1])``            ``++freq[p];``        ``else``            ``++freq[++p];``    ``}`` ` `    ``// Sort frequencies in descending order``    ``sort(freq, freq + n, greater<``int``>());``     ` `    ``// To store the required answer``    ``int` `ans = 0;``    ``for` `(``int` `i = k; i <= p; i++)``        ``ans += freq[i];``         ` `    ``// Return the required answer``    ``return` `ans;``}`` ` `// Driver code``int` `main()``{``    ``int` `arr[] = { 1, 2, 7, 8, 2, 3, 2, 3 };``     ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``     ` `    ``int` `k = 2;``     ` `    ``cout << Min_Replace(arr, n, k);``     ` `    ``return` `0;``}`

## Java

 `// C# program to minimum changes required ``// in an array for k distinct elements.``import` `java.util.*;`` ` `class` `GFG``{``    ``static` `int` `MAX = ``100005``;``     ` `    ``// Function to minimum changes required ``    ``// in an array for k distinct elements.``    ``static` `int` `Min_Replace(``int` `[] arr, ``                           ``int` `n, ``int` `k)``    ``{``        ``Arrays.sort(arr);``     ` `        ``// Store the frequency of each element``        ``Integer [] freq = ``new` `Integer[MAX];``        ``Arrays.fill(freq, ``0``);``        ``int` `p = ``0``;``        ``freq[p] = ``1``;``         ` `        ``// Store the frequency of elements``        ``for` `(``int` `i = ``1``; i < n; i++)``        ``{``            ``if` `(arr[i] == arr[i - ``1``])``                ``++freq[p];``            ``else``                ``++freq[++p];``        ``}``     ` `        ``// Sort frequencies in descending order``        ``Arrays.sort(freq, Collections.reverseOrder());``         ` `        ``// To store the required answer``        ``int` `ans = ``0``;``        ``for` `(``int` `i = k; i <= p; i++)``            ``ans += freq[i];``             ` `        ``// Return the required answer``        ``return` `ans;``    ``}``     ` `    ``// Driver code``    ``public` `static` `void` `main (String []args)``    ``{``        ``int` `[] arr = { ``1``, ``2``, ``7``, ``8``, ``2``, ``3``, ``2``, ``3` `};``         ` `        ``int` `n = arr.length;``         ` `        ``int` `k = ``2``;``         ` `        ``System.out.println(Min_Replace(arr, n, k));``    ``}``}`` ` `// This code is contributed by PrinciRaj1992 `

## Python3

 `# Python 3 program to minimum changes required ``# in an array for k distinct elements.``MAX` `=` `100005`` ` `# Function to minimum changes required ``# in an array for k distinct elements.``def` `Min_Replace(arr, n, k):``    ``arr.sort(reverse ``=` `False``)`` ` `    ``# Store the frequency of each element``    ``freq ``=` `[``0` `for` `i ``in` `range``(``MAX``)]``     ` `    ``p ``=` `0``    ``freq[p] ``=` `1``     ` `    ``# Store the frequency of elements``    ``for` `i ``in` `range``(``1``, n, ``1``):``        ``if` `(arr[i] ``=``=` `arr[i ``-` `1``]):``            ``freq[p] ``+``=` `1``        ``else``:``            ``p ``+``=` `1``            ``freq[p] ``+``=` `1`` ` `    ``# Sort frequencies in descending order``    ``freq.sort(reverse ``=` `True``)``     ` `    ``# To store the required answer``    ``ans ``=` `0``    ``for` `i ``in` `range``(k, p ``+` `1``, ``1``):``        ``ans ``+``=` `freq[i]``         ` `    ``# Return the required answer``    ``return` `ans`` ` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``arr ``=` `[``1``, ``2``, ``7``, ``8``, ``2``, ``3``, ``2``, ``3``]``     ` `    ``n ``=` `len``(arr)``     ` `    ``k ``=` `2``     ` `    ``print``(Min_Replace(arr, n, k))``     ` `# This code is contributed by``# Surendra_Gangwar`

## C#

 `// C# program to minimum changes required ``// in an array for k distinct elements.``using` `System;`` ` `class` `GFG``{``    ``static` `int` `MAX = 100005;``     ` `    ``// Function to minimum changes required ``    ``// in an array for k distinct elements.``    ``static` `int` `Min_Replace(``int` `[] arr, ``                           ``int` `n, ``int` `k)``    ``{``        ``Array.Sort(arr);``     ` `        ``// Store the frequency of each element``        ``int` `[] freq = ``new` `int``[MAX];``         ` `        ``int` `p = 0;``        ``freq[p] = 1;``         ` `        ``// Store the frequency of elements``        ``for` `(``int` `i = 1; i < n; i++)``        ``{``            ``if` `(arr[i] == arr[i - 1])``                ``++freq[p];``            ``else``                ``++freq[++p];``        ``}``     ` `        ``// Sort frequencies in descending order``        ``Array.Sort(freq);``        ``Array.Reverse(freq);``         ` `        ``// To store the required answer``        ``int` `ans = 0;``        ``for` `(``int` `i = k; i <= p; i++)``            ``ans += freq[i];``             ` `        ``// Return the required answer``        ``return` `ans;``    ``}``     ` `    ``// Driver code``    ``public` `static` `void` `Main ()``    ``{``        ``int` `[] arr = { 1, 2, 7, 8, 2, 3, 2, 3 };``         ` `        ``int` `n = arr.Length;``         ` `        ``int` `k = 2;``         ` `        ``Console.WriteLine(Min_Replace(arr, n, k));``    ``}``}`` ` `// This code is contributed by ihritik`

Output:

```3
```

Time Complexity : O(NlogN)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up