Given an array arr[] of N integers, the task is to find the minimum deletions required such that frequency of arr[i] is exactly arr[i] in the array for all possible values of i.
Examples:
Input: arr[] = {1, 2, 2, 3, 3}
Output: 2
Frequency(1) = 1
Frequency(2) = 2
Frequency(3) = 2, frequency can’t be increased
So, delete every occurrence of 3.
Input: arr[] = {2, 3, 2, 3, 4, 4, 4, 4, 5}
Output: 3
Approach: There are two cases:
- If frequency of X is greater than or equal o X then we delete extra frequencies of X to get exactly X elements of value X.
- If frequency of X is less than X then we delete all of the occurrences of X as it is impossible to get extra element of value X.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function to return the minimum// deletions requiredint MinDeletion(int a[], int n){ // To store the frequency of // the array elements unordered_map<int, int> map; // Store frequency of each element for (int i = 0; i < n; i++) map[a[i]]++; // To store the minimum deletions required int ans = 0; for (auto i : map) { // Value int x = i.first; // It's frequency int frequency = i.second; // If number less than or equal // to it's frequency if (x <= frequency) { // Delete extra occurrences ans += (frequency - x); } // Delete every occurrence of x else ans += frequency; } return ans;}// Driver codeint main(){ int a[] = { 2, 3, 2, 3, 4, 4, 4, 4, 5 }; int n = sizeof(a) / sizeof(a[0]); cout << MinDeletion(a, n); return 0;} |
Java
// Java Implementation of above approach import java.util.*;class GFG { // Function to return the minimum// deletions requiredstatic int MinDeletion(int a[], int n){ // To store the frequency of // the array elements Map<Integer,Integer> mp = new HashMap<>(); // Store frequency of each element for (int i = 0 ; i < n; i++) { if(mp.containsKey(a[i])) { mp.put(a[i], mp.get(a[i])+1); } else { mp.put(a[i], 1); } } // To store the minimum deletions required int ans = 0; for (Map.Entry<Integer,Integer> i : mp.entrySet()) { // Value int x = i.getKey(); // It's frequency int frequency = i.getValue(); // If number less than or equal // to it's frequency if (x <= frequency) { // Delete extra occurrences ans += (frequency - x); } // Delete every occurrence of x else ans += frequency; } return ans;}// Driver codepublic static void main(String[] args){ int a[] = { 2, 3, 2, 3, 4, 4, 4, 4, 5 }; int n = a.length; System.out.println(MinDeletion(a, n));}}// This code is contributed by Rajput-Ji |
Python3
# Python3 implementation of the approach # Function to return the minimum # deletions required def MinDeletion(a, n) : # To store the frequency of # the array elements map = dict.fromkeys(a, 0); # Store frequency of each element for i in range(n) : map[a[i]] += 1; # To store the minimum deletions required ans = 0; for key,value in map.items() : # Value x = key; # It's frequency frequency = value; # If number less than or equal # to it's frequency if (x <= frequency) : # Delete extra occurrences ans += (frequency - x); # Delete every occurrence of x else : ans += frequency; return ans; # Driver code if __name__ == "__main__" : a = [ 2, 3, 2, 3, 4, 4, 4, 4, 5 ]; n = len(a); print(MinDeletion(a, n)); # This code is contributed by AnkitRai01 |
C#
// C# Implementation of above approachusing System;using System.Collections.Generic; class GFG { // Function to return the minimum// deletions requiredstatic int MinDeletion(int []a, int n){ // To store the frequency of // the array elements Dictionary<int, int> mp = new Dictionary<int, int>(); // Store frequency of each element for (int i = 0 ; i < n; i++) { if(mp.ContainsKey(a[i])) { var val = mp[a[i]]; mp.Remove(a[i]); mp.Add(a[i], val + 1); } else { mp.Add(a[i], 1); } } // To store the minimum deletions required int ans = 0; foreach(KeyValuePair<int, int> i in mp) { // Value int x = i.Key; // It's frequency int frequency = i.Value; // If number less than or equal // to it's frequency if (x <= frequency) { // Delete extra occurrences ans += (frequency - x); } // Delete every occurrence of x else ans += frequency; } return ans;}// Driver codepublic static void Main(String[] args){ int []a = { 2, 3, 2, 3, 4, 4, 4, 4, 5 }; int n = a.Length; Console.WriteLine(MinDeletion(a, n));}}// This code is contributed by PrinciRaj1992 |
Javascript
<script>// javaScript implementation of the approach// Function to return the minimum// deletions requiredfunction MinDeletion( a, n){ // To store the frequency of // the array elements let map = new Map(); // Store frequency of each element for (let i = 0; i < n; i++){ if(map[a[i]]) map[a[i]]++; else map[a[i]] = 1 } // To store the minimum deletions required let ans = 0; for(var m in map){ // Value let x = m; // It's frequency let frequency = map[m]; // If number less than or equal // to it's frequency if (x <= frequency) { // Delete extra occurrences ans += (frequency - x); } // Delete every occurrence of x else ans += frequency; }; return ans;}// Driver codelet a = [ 2, 3, 2, 3, 4, 4, 4, 4, 5 ];let n = a.length;document.write( MinDeletion(a, n));// This code is contributed by rohitsingh07052.</script> |
3
Time Complexity: O(n), where n is the size of the given array.
Auxiliary Space: O(n), where n is the size of the given array.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
