Related Articles
Split an array containing N elements into K sets of distinct elements
• Last Updated : 07 Dec, 2020

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: -1
Explanation:
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 ` `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;` `}`

## 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 freq = ``new` `HashMap<>();`   `    ``// Store the required sets` `    ``Map> 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());` `        `  `        ``ans.get(freq.get(a[i])).add(a[i]);` `    ``}` `    `  `    ``// Display the sets` `    ``for``(ArrayList 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`

## 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`

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.

My Personal Notes arrow_drop_up
Recommended Articles
Page :