Given two integers **N** and **K **and an array **arr[]** consisting of duplicate elements, the task is to split N elements into K sets of distinct elements.**Examples:**

Input:N = 5, K = 2, arr[] = {3, 2, 1, 2, 3}Output:

( 3 2 1 )

( 2 3 )Input:N = 5, K = 2, arr[] = {2, 1, 1, 2, 1}Output:-1Explanation:

It is not possible to split all the elements into K sets of distinct elements as 1 appears more than K times in the array.

**Approach: **In order to solve the problem, we are using a map to store the frequency of every element. If the frequency of any element exceeds **K**, print **-1**. Maintain another map to store the sets for every respective frequencies. If no element has a frequency greater than **K**, print the sets for all corresponding frequencies as the required set.

Below is the implementation of the above approach:

## C++

`// C++ Program to split N elements` `// into exactly K sets consisting` `// of no distinct elements` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to check if possible to` `// split N elements into exactly K` `// sets consisting of no distinct elements` `void` `splitSets(` `int` `a[], ` `int` `n, ` `int` `k)` `{` ` ` `// Store the frequency` ` ` `// of each element` ` ` `map<` `int` `, ` `int` `> freq;` ` ` `// Store the required sets` ` ` `map<` `int` `, vector<` `int` `> > ans;` ` ` `for` `(` `int` `i = 0; i < n; i++) {` ` ` `// If frequency of a` ` ` `// particular element` ` ` `// exceeds K` ` ` `if` `(freq[a[i]] + 1 > k) {` ` ` `// Not possible` ` ` `cout << -1 << endl;` ` ` `return` `;` ` ` `}` ` ` `// Increase the frequency` ` ` `freq[a[i]] += 1;` ` ` `// Store the element for the` ` ` `// respective set` ` ` `ans[freq[a[i]]].push_back(a[i]);` ` ` `}` ` ` `// Display the sets` ` ` `for` `(` `auto` `it : ans) {` ` ` `cout << ` `"( "` `;` ` ` `for` `(` `int` `i : it.second) {` ` ` `cout << i << ` `" "` `;` ` ` `}` ` ` `cout << ` `")\n"` `;` ` ` `}` `}` `// Driver code` `int` `main()` `{` ` ` `int` `arr[] = { 2, 1, 2, 3, 1,` ` ` `4, 1, 3, 1, 4 };` ` ` `int` `n = ` `sizeof` `(arr) / ` `sizeof` `(` `int` `);` ` ` `int` `k = 4;` ` ` `splitSets(arr, n, k);` ` ` `return` `0;` `}` |

*chevron_right*

*filter_none*

## Java

`// Java program to split N elements ` `// into exactly K sets consisting ` `// of no distinct elements ` `import` `java.util.*;` `class` `GFG{` ` ` `// Function to check if possible to` `// split N elements into exactly K` `// sets consisting of no distinct elements` `static` `void` `splitSets(` `int` `a[], ` `int` `n, ` `int` `k)` `{` ` ` ` ` `// Store the frequency` ` ` `// of each element` ` ` `Map<Integer, Integer> freq = ` `new` `HashMap<>();` ` ` `// Store the required sets` ` ` `Map<Integer, ` ` ` `ArrayList<Integer>> ans = ` `new` `HashMap<>();` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++)` ` ` `{` ` ` ` ` `// If frequency of a` ` ` `// particular element` ` ` `// exceeds K` ` ` `if` `(freq.get(a[i]) != ` `null` `)` ` ` `{` ` ` `if` `(freq.get(a[i]) + ` `1` `> k) ` ` ` `{` ` ` ` ` `// Not possible` ` ` `System.out.println(-` `1` `);` ` ` `return` `;` ` ` `}` ` ` `}` ` ` ` ` `// Increase the frequency` ` ` `freq.put(a[i], freq.getOrDefault(a[i], ` `0` `) + ` `1` `);` ` ` ` ` `// Store the element for the` ` ` `// respective set` ` ` `if` `( ans.get(freq.get(a[i])) == ` `null` `)` ` ` `ans.put(freq.get(a[i]),` ` ` `new` `ArrayList<Integer>());` ` ` ` ` `ans.get(freq.get(a[i])).add(a[i]);` ` ` `}` ` ` ` ` `// Display the sets` ` ` `for` `(ArrayList<Integer> it : ans.values())` ` ` `{` ` ` `System.out.print(` `"( "` `);` ` ` `for` `(` `int` `i = ` `0` `; i < it.size() - ` `1` `; i++)` ` ` `{` ` ` `System.out.print(it.get(i) + ` `" "` `);` ` ` `}` ` ` ` ` `System.out.print(it.get(it.size() - ` `1` `));` ` ` `System.out.println(` `" )"` `);` ` ` `}` `}` `// Driver code ` `public` `static` `void` `main (String[] args)` `{` ` ` `int` `arr[] = { ` `2` `, ` `1` `, ` `2` `, ` `3` `, ` `1` `,` ` ` `4` `, ` `1` `, ` `3` `, ` `1` `, ` `4` `};` ` ` ` ` `int` `n = arr.length;` ` ` `int` `k = ` `4` `;` ` ` ` ` `splitSets(arr, n, k);` `}` `}` `// This code is contributed by coder001` |

*chevron_right*

*filter_none*

## Python3

`# Python3 Program to split N elements ` `# into exactly K sets consisting ` `# of no distinct elements ` `# Function to check if possible to ` `# split N elements into exactly K ` `# sets consisting of no distinct elements ` `def` `splitSets(a, n, k) : ` ` ` `# Store the frequency ` ` ` `# of each element ` ` ` `freq ` `=` `{} ` ` ` `# Store the required sets ` ` ` `ans ` `=` `{}` ` ` `for` `i ` `in` `range` `(n) :` ` ` ` ` `# If frequency of a ` ` ` `# particular element ` ` ` `# exceeds K ` ` ` `if` `a[i] ` `in` `freq :` ` ` `if` `freq[a[i]] ` `+` `1` `> k :` ` ` ` ` `# Not possible` ` ` `print` `(` `-` `1` `)` ` ` `return` ` ` `# Increase the frequency ` ` ` `if` `a[i] ` `in` `freq :` ` ` `freq[a[i]] ` `+` `=` `1` ` ` `else` `:` ` ` `freq[a[i]] ` `=` `1` ` ` ` ` `# Store the element for the ` ` ` `# respective set ` ` ` `if` `freq[a[i]] ` `in` `ans :` ` ` `ans[freq[a[i]]].append(a[i])` ` ` `else` `:` ` ` `ans[freq[a[i]]] ` `=` `[a[i]]` ` ` ` ` `# Display the sets ` ` ` `for` `it ` `in` `ans :` ` ` `print` `(` `"( "` `, end ` `=` `"") ` ` ` `for` `i ` `in` `ans[it] : ` ` ` `print` `(i , end ` `=` `" "` `)` ` ` ` ` `print` `(` `")"` `) ` `arr ` `=` `[ ` `2` `, ` `1` `, ` `2` `, ` `3` `, ` `1` `, ` `4` `, ` `1` `, ` `3` `, ` `1` `, ` `4` `] ` `n ` `=` `len` `(arr)` `k ` `=` `4` `splitSets(arr, n, k)` `# This code is contributed by divyesh072019` |

*chevron_right*

*filter_none*

**Output:**

( 2 1 3 4 ) ( 2 1 3 4 ) ( 1 ) ( 1 )

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.