Given an array arr[] containing n elements. The problem is to find the maximum number of distinct elements (non-repeating) after removing k elements from the array.
Note: 1 <= k <= n.
Examples:
Input : arr[] = {5, 7, 5, 5, 1, 2, 2}, k = 3
Output : 4
Remove 2 occurrences of element 5 and
1 occurrence of element 2.
Input : arr[] = {1, 2, 3, 4, 5, 6, 7}, k = 5
Output : 2
Input : arr[] = {1, 2, 2, 2}, k = 1
Output : 1
Approach: Following are the steps:
- Make a multi set from the given array.
- During making this multiset check if the current element is present or not in multiset, if it is already present then simply reduce the k value and do not insert in the multiset.
- If k becomes 0 then simply just put values in multiset.
- After traversing the whole given array,
- If k is not equal to zero then it means the multiset is consist of only unique elements and we have to remove any of the k elements from the multiset to make k=0, so in this case the answer will be size of multiset minus k value at that time.
- If k is equal to zero then it means there may be duplicate values present in the multiset so put all the values in a set and the size of this set will be the number of distinct elements after removing k elements
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxDistinctNum( int a[], int n, int k)
{
int i;
multiset< int > s;
for (i=0;i<n;i++){
if (s.find(a[i])==s.end()||k==0)
s.insert(a[i]);
else
{
k--;
}
}
if (k!=0)
return s.size()-k;
else {
set< int > st;
for ( auto it:s){
st.insert(it);
}
return st.size();
}
}
int main()
{
int arr[] = { 5, 7, 5, 5, 1, 2, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 3;
cout << "Maximum distinct elements = "
<< maxDistinctNum(arr, n, k);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int maxDistinctNum( int arr[], int n, int k)
{
HashMap<Integer, Integer> numToFreq
= new HashMap<>();
for ( int i = 0 ; i < n; i++) {
numToFreq.put(arr[i],
numToFreq.getOrDefault(arr[i], 0 )
+ 1 );
}
int result = 0 ;
PriorityQueue<Integer> minHeap
= new PriorityQueue<Integer>();
for (Map.Entry<Integer, Integer> p :
numToFreq.entrySet()) {
if (p.getValue() == 1 )
++result;
else
minHeap.add(p.getValue());
}
while (k != 0 && !minHeap.isEmpty()) {
Integer t = minHeap.poll();
if (t == 1 ) {
++result;
}
else {
--t;
--k;
minHeap.add(t);
}
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 5 , 7 , 5 , 5 , 1 , 2 , 2 };
int n = arr.length;
int k = 3 ;
System.out.println( "Maximum distinct elements = "
+ maxDistinctNum(arr, n, k));
}
}
|
Python3
def maxDistinctNum(a, n, k):
s = {}
for i in range (n):
if a[i] not in s or k = = 0 :
s[a[i]] = s.get(a[i], 0 ) + 1
else :
s[a[i]] = 1
k - = 1
if k ! = 0 :
return len (s) - k
else :
st = set ()
for i in s:
st.add(i)
return len (st)
if __name__ = = "__main__" :
arr = [ 5 , 7 , 5 , 5 , 1 , 2 , 2 ]
K = 3
N = len (arr)
print ( "Maximum distinct elements = " , maxDistinctNum(arr, N, K))
|
C#
using System;
using System.Linq;
using System.Collections.Generic;
class MainClass {
public static int maxDistinctNum( int [] a, int n, int k) {
HashSet< int > s = new HashSet< int >();
for ( int i=0;i<n;i++){
if (!s.Contains(a[i]) || k==0)
s.Add(a[i]);
else
{
k--;
}
}
if (k!=0)
return s.Count()-k;
else {
return s.Distinct().Count();
}
}
public static void Main ( string [] args) {
int [] arr = { 5, 7, 5, 5, 1, 2, 2 };
int n = arr.Length;
int k = 3;
Console.WriteLine( "Maximum distinct elements = " + maxDistinctNum(arr, n, k));
}
}
|
Javascript
<script>
function maxDistinctNum(a, n, k)
{
var i;
var s = [];
for (i=0;i<n;i++){
if (!s.includes(a[i])||k==0)
s.push(a[i]);
else
{
k--;
}
}
if (k!=0)
return s.size-k;
else {
var st = new Set();
s.forEach(element => {
st.add(element);
});
return st.size;
}
}
var arr = [5, 7, 5, 5, 1, 2, 2];
var n = arr.length;
var k = 3;
document.write( "Maximum distinct elements = "
+ maxDistinctNum(arr, n, k));
</script>
|
Output
Maximum distinct elements = 4
Time Complexity: O(k*logd), where d is the number of distinct elements in the given array.
Auxiliary Space: O(N), because we are using multiset.
Another Approach: Follow the below steps, to solve this problem:
- Find the Number of distinct Toys.
- Sum of number of element except one element form every distinct Toys.
- Check sum if greater than or equal K then Return all distinct element.
- Otherwise decrement number of distinct element and to fill K.
- Return Size of vector.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int MaxNumber( int arr[], int N, int K)
{
unordered_map< int , int > mp;
for ( int i = 0; i < N; i++) {
mp[arr[i]]++;
}
vector< int > v1;
for ( auto i : mp) {
v1.push_back(i.second);
}
int temp = 0;
for ( int i = 0; i < v1.size(); i++) {
temp += v1[i] - 1;
}
if (K <= temp) {
return v1.size();
}
else {
K = K - temp;
int ans = v1.size();
while (K) {
ans--;
K--;
}
return ans;
}
}
int main()
{
int arr[] = { 10, 10, 10, 50, 50 };
int K = 3;
int N = sizeof (arr) / sizeof (arr[0]);
cout << MaxNumber(arr, N, K) << endl;
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int MaxNumber( int [] arr, int N, int K)
{
HashMap<Integer, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < N; i++) {
mp.put(arr[i], mp.getOrDefault(arr[i], 0 ) + 1 );
}
List<Integer> v1 = new ArrayList<>();
for (Map.Entry<Integer, Integer> i :
mp.entrySet()) {
v1.add(i.getValue());
}
int temp = 0 ;
for ( int i = 0 ; i < v1.size(); i++) {
temp += v1.get(i) - 1 ;
}
if (K <= temp) {
return v1.size();
}
else {
K = K - temp;
int ans = v1.size();
while (K != 0 ) {
ans--;
K--;
}
return ans;
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 10 , 10 , 50 , 50 };
int K = 3 ;
int N = arr.length;
System.out.println(MaxNumber(arr, N, K));
}
}
|
Python3
def MaxNumber(arr, N, K):
mp = {}
for i in range (N):
if arr[i] not in mp:
mp[arr[i]] = 0
mp[arr[i]] + = 1
v1 = []
for i in mp:
v1.append(mp[i])
temp = 0
for i in range ( len (v1)):
temp + = v1[i] - 1
if K < = temp:
return len (v1)
else :
K = K - temp
ans = len (v1)
while K:
ans - = 1
K - = 1
return ans
if __name__ = = "__main__" :
arr = [ 10 , 10 , 10 , 50 , 50 ]
K = 3
N = len (arr)
print (MaxNumber(arr, N, K))
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
public class GFG {
static int MaxNumber( int [] arr, int N, int K)
{
Dictionary< int , int > mp
= new Dictionary< int , int >();
for ( int i = 0; i < N; i++) {
if (mp.ContainsKey(arr[i])) {
mp[arr[i]]++;
}
else {
mp.Add(arr[i], 1);
}
}
ArrayList v1 = new ArrayList();
foreach (KeyValuePair< int , int > i in mp)
{
v1.Add(i.Value);
}
int temp = 0;
for ( int i = 0; i < v1.Count; i++) {
temp += ( int )v1[i] - 1;
}
if (K <= temp) {
return v1.Count;
}
else {
K = K - temp;
int ans = v1.Count;
while (K != 0) {
ans--;
K--;
}
return ans;
}
}
static public void Main()
{
int [] arr = { 10, 10, 10, 50, 50 };
int K = 3;
int N = arr.Length;
Console.WriteLine(MaxNumber(arr, N, K));
}
}
|
Javascript
<script>
function MaxNumber(arr, N, K) {
let mp = new Map();
for (let i = 0; i < N; i++) {
if (mp.has(arr[i])) {
mp.set(arr[i], mp.get(arr[i]) + 1);
} else {
mp.set(arr[i], 1);
}
}
let v1 = [];
for (let i of mp) {
v1.push(i[1]);
}
let temp = 0;
for (let i = 0; i < v1.length; i++) {
temp += v1[i] - 1;
}
if (K <= temp) {
return v1.length;
} else {
K = K - temp;
let ans = v1.length;
while (K) {
ans--;
K--;
}
return ans;
}
}
let arr = [10, 10, 10, 50, 50];
let K = 3;
let N = arr.length;
console.log(MaxNumber(arr, N, K));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
22 Jan, 2023
Like Article
Save Article