Divide array in two maximum equal length arrays of similar and dissimilar elements

Given an array arr of natural numbers up to n, find the maximum size for which array arr can be divided into two equal-sized arrays, such that the first array contains all same elements while the second array contains all distinct elements.

Examples:

Input :n = 8, arr[] ={7, 3, 7, 1, 7, 7}
Output :
Maximum size is : 3
arr1[] ={7, 7, 7}
arr2[] ={1, 3, 7}
Explanation :
It is possible to construct two arrays of size 3.
The first array is [7, 7, 7] and the second array is [1, 3, 7].

Input : n = 7, arr[] ={1, 2, 1, 5, 1, 6, 7, 2}
Output :
Maximum size is : 3
arr1[] ={1, 1, 1}
arr2[] ={2, 5, 6}

Approach:



To solve the problem mentioned above the main idea is to use hashing to find the frequency of every element present in the array.

  • Find the element with maximum frequency present in the array arr[] using hash vector v.
  • Find the total unqiue elements present in array arr[].
  • There are two cases for the element with maximum frequency: the maximum frequency element will go to the first array then the sizes of array are at most diff1 – 1 and max1 correspondingly. Otherwise, at least one element of maximum frequency goes to the second array and the sizes are at most diff1 and max1 ? 1 correspondingly. Then find the max-size to which array can be splitted as max(min(diff1 ? 1, max1), min(diff1, max1 ? 1)).
  • Find the first array of similar elements using max_size and element with maximum frequency max1.
  • Find the second array of unique elements using max_size and hash vector v.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the max-size to which
// an array can be divided into 2 equal parts
// such that one part contains unique elements 
// while another contains similar elements
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the max-size to which an array
// can be divided into 2 equal parts
void Solve(int arr[], int size, int n)
{
  
    vector<int> v(n + 1);
  
    // Vector to find the frequency of
    // each element of array
    for (int i = 0; i < size; i++)
        v[arr[i]]++;
  
    // Find the maximum frequency
    // element present in array arr[]
    int max1 = (max_element(v.begin(), v.end()) 
                                       - v.begin());
  
    // Find total unique elements
    // present in array arr[]
    int diff1 = n + 1 - count(v.begin(), v.end(), 0);
  
    // Find the Max-Size to which
    // an array arr[] can be splitted
    int max_size = max(min(v[max1] - 1, diff1), 
                            min(v[max1], diff1 - 1));
  
    cout << "Maximum size is :" << max_size << "\n";
  
    // Find the first array
    // containing same elements
    cout << "The First Array Is : \n";
    for (int i = 0; i < max_size; i++) {
        cout << max1 << " ";
        v[max1] -= 1;
    }
  
    cout << "\n";
  
    // Find the second array
    // containing unique elements
    cout << "The Second Array Is : \n";
    for (int i = 0; i < (n + 1); i++) {
        if (v[i] > 0) {
            cout << i << " ";
            max_size--;
        }
        if (max_size < 1)
            break;
    }
  
    cout << "\n";
}
  
// Driver code
int main()
{
    // initialise n
    int n = 7;
  
    // array declaration
    int arr[] = { 1, 2, 1, 5, 1, 6, 7, 2 };
  
    // size of array
    int size = sizeof(arr) / sizeof(arr[0]);
  
    Solve(arr, size, n);
  
    return 0;
}

chevron_right


Output:

Maximum size is :3
The First Array Is : 
1 1 1 
The Second Array Is : 
2 5 6

Time Commplexity :O(N)

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.




My Personal Notes arrow_drop_up

Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.