Open In App

Minimize the maximum frequency of Array elements by replacing them only once

Last Updated : 21 Dec, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array A[] of length N, the task is to minimize the maximum frequency of any array element by performing the following operation only once:

  • Choose any random set (say S) of indices i (0 ? i ? N-1) of the array such that every element of S is the same and 
  • Replace every element of that index with any other number.

Examples:

Input: A[] = {1 ,4 ,4 ,1 ,4 , 4} 
Output: 2
Explanation: Choose index i = {1, 2} and perform the operation 
{ 1, 4, 4, 1, 4, 4 }? { 1, 5, 5, 1, 4, 4 }. 
The highest frequency is of element 4, 5 and 1 which is 2
This is the minimum possible value of highest frequency of an element.

Input: A[] = {5 ,5 ,5 ,5 ,5 } 
Output: 3

Approach: The problem can be solved based on the following observation: 

  • Let N be the element with the maximum frequency in A[] and M be the element with the second maximum frequency in A[]. It is possible that M does not exist.
  • If M exist then maximum frequency = freqN
    • Indices such that A[i] = N, should be chosen because the final value of freqN should be minimized and it is always better to replace with number(num) such that num ? M. Only a maximum of ? freqN/2? elements should be replaced because if we replace more, then num becomes the new element with the maximum frequency
    • Hence, it is optimal to replace ? freqN/2?  occurrences of N to some num ? M.Now, freqN – ? freqN/2? is the final frequency of N and freq is the final frequency of M. 
    • The maximum among these two i.e. Max( freqN – ? freqN/2?, freqM ) has to be the answer because the frequency of num = ?freqN/2? ?( freqN – ? freqN/2?) = frequency of N .
  • If M does not exist it means freqM = 0 . So , the answer is freqN – ? freqN/2?.

Follow the below steps to implement the above idea:

  • Find the frequency of the most frequent and the second most frequent element.
  • Compare those frequencies.
    • Based on the frequency, follow the above conditions to find the minimized value of maximum frequency.

Below is the implementation of the above approach.

C++




#include <bits/stdc++.h>
using namespace std;
 
// Function to minimize frequency of
// most frequent element
int minFreq(int arr[], int n)
{
 
    int b[n];
    for (int i = 0; i < n; i++) {
        b[i] = 0;
    }
    unordered_map<int, int> mp;
    for (int i = 0; i < n; i++) {
        if (mp.count(arr[i]) < 0) {
            mp[arr[i]] = 1;
        }
        else {
            mp[arr[i]]++;
        }
    }
 
    for (int i = 0; i < n; i++) {
        if (mp[arr[i]] != -1) {
 
            // Count frequency of each element
            b[i] = mp[arr[i]];
            mp[arr[i]] = -1;
        }
    }
 
    // Last index value is maximum
    // frequency of any element
    sort(b, b + n);
    if (b[n - 1] % 2 == 0) {
        b[n - 1] = b[n - 1] / 2;
    }
    else {
        b[n - 1] = (b[n - 1] + 1) / 2;
    }
 
    // Last index value is possible
    // minimum frequency of
    // most frequent element
    sort(b, b + n);
    return b[n - 1];
}
 
int main()
{
 
    int A[] = { 1, 4, 4, 1, 4, 4 };
    int N = sizeof(A) / sizeof(A[0]);
 
    // Function call
    cout << (minFreq(A, N));
    return 0;
}
 
// This code is contributed by akashish__


Java




// Java code to implement the approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to minimize frequency of
    // most frequent element
    public static int minFreq(int arr[], int n)
    {
 
        int[] b = new int[n];
        Map<Integer, Integer> mp = new HashMap<>();
        for (int i = 0; i < n; i++) {
            mp.put(arr[i], mp.get(arr[i]) == null
                               ? 1
                               : mp.get(arr[i]) + 1);
        }
 
        for (int i = 0; i < n; i++) {
            if (mp.get(arr[i]) != -1) {
                 
                // Count frequency of each element
                b[i] = mp.get(arr[i]);
                mp.put(arr[i], -1);
            }
        }
 
        // Last index value is maximum
        // frequency of any element
        Arrays.sort(b);
        if (b[n - 1] % 2 == 0) {
            b[n - 1] = b[n - 1] / 2;
        }
        else {
            b[n - 1] = (b[n - 1] + 1) / 2;
        }
         
        // Last index value is possible
        // minimum frequency of
        // most frequent element
        Arrays.sort(b);
        return b[n - 1];
    }
     
      // Driver Code
    public static void main(String[] args)
    {
        int A[] = { 1, 4, 4, 1, 4, 4 };
        int N = A.length;
 
        // Function call
        System.out.println(minFreq(A, N));
    }
}


Python3




# Python3 code to implement the above approach
 
# Function to minimize frequency of
# most frequent element
def minFreq(arr, n) :
     
    b = [0] * n;
     
    mp = dict.fromkeys(arr, 0);
     
    for i in range(n) :
         
        if arr[i] in mp :
            mp[arr[i]] +=1;
             
        else :
            mp[arr[i]] = 1;
           
    for i in range(n) :
         
        if (mp[arr[i]] != -1) :
            # Count frequency of each element
            b[i] = mp[arr[i]];
            mp[arr[i]] = -1;
 
    # Last index value is maximum
    # frequency of any element
    b.sort()
         
    if (b[n - 1] % 2 == 0) :
        b[n - 1] = b[n - 1] // 2;
    else :
        b[n - 1] = (b[n - 1] + 1) // 2;
         
    # Last index value is possible
    # minimum frequency of
    # most frequent element
    b.sort();   
    return b[n - 1];
 
if __name__ == "__main__" :
     
    A = [ 1, 4, 4, 1, 4, 4 ];
    N = len(A);
 
    # Function call
    print(minFreq(A, N));
    
    # This code is contributed by AnkThon


C#




// C# code to implement the approach
using System;
using System.Collections.Generic;
class GFG {
 
  // Function to minimize frequency of
  // most frequent element
  public static int minFreq(int[] arr, int n)
  {
 
    int[] b = new int[n];
    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);
    }
 
    for (int i = 0; i < n; i++) {
      if (mp[arr[i]] != -1) {
 
        // Count frequency of each element
        b[i] = mp[arr[i]];
        mp[arr[i]] = -1;
      }
    }
 
    // Last index value is maximum
    // frequency of any element
    Array.Sort(b);
    if (b[n - 1] % 2 == 0) {
      b[n - 1] = b[n - 1] / 2;
    }
    else {
      b[n - 1] = (b[n - 1] + 1) / 2;
    }
 
    // Last index value is possible
    // minimum frequency of
    // most frequent element
    Array.Sort(b);
    return b[n - 1];
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
    int[] A = { 1, 4, 4, 1, 4, 4 };
    int N = A.Length;
 
    // Function call
    Console.WriteLine(minFreq(A, N));
  }
}
 
// This code is contributed by ukasp.


Javascript




<script>
// Javascript code to implement the approach
 
// Function to minimize frequency of
// most frequent element
function minFreq(arr, n) {
 
    let b = new Array(n).fill(0);
    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)
        }
    }
 
    for (let i = 0; i < n; i++) {
        if (mp.get(arr[i]) != -1) {
 
            // Count frequency of each element
            b[i] = mp.get(arr[i]);
            mp.set(arr[i], -1);
        }
    }
 
    // Last index value is maximum
    // frequency of any element
    b.sort((a, b) => a - b);
    if (b[n - 1] % 2 == 0) {
        b[n - 1] = Math.floor(b[n - 1] / 2);
    }
    else {
        b[n - 1] = Math.floor((b[n - 1] + 1) / 2);
    }
 
    // Last index value is possible
    // minimum frequency of
    // most frequent element
    b.sort((a, b) => a - b);
    return b[n - 1];
}
 
// Driver Code
 
let A = [1, 4, 4, 1, 4, 4];
let N = A.length;
 
// Function call
document.write(minFreq(A, N));
 
// This code is contributed by saurabh_jaiswal.
</script>


Output

2

Time Complexity: O(N * logN) //the inbuilt sort function takes N log N time to complete all operations, hence the overall time taken by the algorithm is N log N
Auxiliary Space: O(N) // an extra array is used and in the worst case all elements will be stored inside it the hence algorithm takes up linear space



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads