# Find minimum changes required in an array for it to contain k distinct elements

• Difficulty Level : Easy
• Last Updated : 28 Sep, 2022

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 :
The elements to be changed are 1, 8
Input : arr[]={1, 2, 7, 8, 2, 3, 2, 3}, k = 2
Output :
The elements to be changed are 1, 7, 8

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[0]);``    ` `    ``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`

## Javascript

 ``

Output:

`3`

Time Complexity : O(NlogN)

Auxiliary Space: O(1) because it is using constant size freq array

My Personal Notes arrow_drop_up