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
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 <bits/stdc++.h>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 codeint 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 codeif __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
<script>// Javascript program to minimum changes required // in an array for k distinct elements.var MAX = 100005;// Function to minimum changes required // in an array for k distinct elements.function Min_Replace(arr, n, k){ arr.sort((a,b)=>a-b) // Store the frequency of each element var freq = Array(MAX).fill(0); var p = 0; freq[p] = 1; // Store the frequency of elements for (var i = 1; i < n; i++) { if (arr[i] == arr[i - 1]) ++freq[p]; else ++freq[++p]; } // Sort frequencies in descending order freq.sort((a,b)=>b-a); // To store the required answer var ans = 0; for (var i = k; i <= p; i++) ans += freq[i]; // Return the required answer return ans;}// Driver codevar arr = [1, 2, 7, 8, 2, 3, 2, 3];var n = arr.length;var k = 2;document.write( Min_Replace(arr, n, k));</script> |
Output:
3
Time Complexity : O(NlogN)
Auxiliary Space: O(1) because it is using constant size freq array
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
