Given an array arr[] consisting of N integers, the task is to find the maximum element with the minimum frequency.
Examples:
Input: arr[] = {2, 2, 5, 50, 1}
Output: 50
Explanation:
The element with minimum frequency is {1, 5, 50}. The maximum element among these element is 50.Input: arr[] = {3, 2, 5, 6, 1}
Output: 6
Approach: Sort the array in non-decreasing order, which brings elements with the same value together. This allows us to easily count and identify when the frequency of an element changes. When the frequency changes (‘currFreq’ <= ‘minFreq’), we update the minimum frequency and as the array is sorted, the current element (arr[i-1]) becomes the maximum element, representing the highest value within its frequency group.
Follow the steps below to solve the given problem:
- Sort the input array in non-decreasing order.
- Initialize minFreq to array size+1, maxElement to the first element of the sorted array, and currFreq to 1.
- Iterate over the sorted array from the second element to the last element.
- If the current element is the same as the previous element, increment currFreq.
- Otherwise, If currFreq is less than or equal to minFreq, update minFreq with currFreq and update maxElement with the previous element.
- Reset currFreq to 1 for the new element.
- After the loop, check the frequency of the last element and update minFreq and maxElement if necessary.
- Return the maxElement, which represents the maximum element with the minimum frequency in the input array.
C++14
// C++ code for the above approach#include <bits/stdc++.h>using namespace std;Â
int maxElementWithMinFreq(int *arr, int N){Â Â Â Â sort(arr, arr + N); // Sort the array in non-decreasing orderÂ
    int minFreq = N + 1;    // Initialize minFreq to a value greater than the array size    int maxElement = arr[0]; // Initialize maxElement to the first element of the sorted array    int currFreq = 1;       // Keep track of the frequency of the current elementÂ
    // Iterate over the sorted array    for (int i = 1; i < N; i++)    {        if (arr[i] == arr[i - 1])        {            currFreq++; // Increment the frequency if the current element is the same as the previous element        }        else        {            // If the frequency of the current element is less than minFreq, update minFreq and maxElement            if (currFreq <= minFreq)            {                minFreq = currFreq;                maxElement = arr[i - 1];            }            currFreq = 1; // Reset the frequency for the new element        }    }Â
    // Check the frequency of the last element    if (currFreq <= minFreq)    {        minFreq = currFreq;        maxElement = arr[N - 1];    }Â
    return maxElement; // Return the maximum element with the minimum frequency}Â
int main(){Â Â Â Â int arr[] = {2, 2, 5, 50, 1};Â Â Â Â int N = sizeof(arr) / sizeof(arr[0]);Â Â Â Â cout << maxElementWithMinFreq(arr, N);Â
    return 0;}//This code is contributed by Abhishek Kumar |
Java
// Java code for the above approachimport java.util.Arrays;Â
public class gfg {Â
    public static int maxElementWithMinFreq(int[] arr, int N) {        Arrays.sort(arr); // Sort the array in non-decreasing orderÂ
        int minFreq = N + 1;    // Initialize minFreq to a value greater than the array size        int maxElement = arr[0]; // Initialize maxElement to the first element of the sorted array        int currFreq = 1;       // Keep track of the frequency of the current elementÂ
        // Iterate over the sorted array        for (int i = 1; i < N; i++) {            if (arr[i] == arr[i - 1]) {                currFreq++; // Increment the frequency if the current element is the same as the previous element            } else {                // If the frequency of the current element is less than minFreq, update minFreq and maxElement                if (currFreq <= minFreq) {                    minFreq = currFreq;                    maxElement = arr[i - 1];                }                currFreq = 1; // Reset the frequency for the new element            }        }Â
        // Check the frequency of the last element        if (currFreq <= minFreq) {            minFreq = currFreq;            maxElement = arr[N - 1];        }Â
        return maxElement; // Return the maximum element with the minimum frequency    }Â
    public static void main(String[] args) {        int[] arr = {2, 2, 5, 50, 1};        int N = arr.length;        System.out.println(maxElementWithMinFreq(arr, N));    }} |
Python3
# Python code for the above approachdef max_element_with_min_freq(arr):Â Â Â Â arr.sort()Â # Sort the array in non-decreasing orderÂ
    # Initialize min_freq to a value greater than the array size    min_freq = len(arr) + 1    # Initialize max_element to the first element of the sorted array    max_element = arr[0]    curr_freq = 1 # Keep track of the frequency of the current elementÂ
    # Iterate over the sorted array    for i in range(1, len(arr)):        if arr[i] == arr[i - 1]:            curr_freq += 1 # Increment the frequency if the current element is the same as the previous element        else:            # If the frequency of the current element is less than min_freq, update min_freq and max_element            if curr_freq <= min_freq:                min_freq = curr_freq                max_element = arr[i - 1]            curr_freq = 1 # Reset the frequency for the new elementÂ
    # Check the frequency of the last element    if curr_freq <= min_freq:        min_freq = curr_freq        max_element = arr[-1]Â
    return max_element # Return the maximum element with the minimum frequencyÂ
Â
arr = [2, 2, 5, 50, 1]print(max_element_with_min_freq(arr)) |
C#
using System;Â
class GFG{Â Â Â Â static int MaxElementWithMinFreq(int[] arr, int N)Â Â Â Â {Â Â Â Â Â Â Â Â Array.Sort(arr); // Sort the array in non-decreasing orderÂ
        int minFreq = N + 1;    // Initialize minFreq to a value greater than the array size        int maxElement = arr[0]; // Initialize maxElement to the first element of the sorted array        int currFreq = 1;       // Keep track of the frequency of the current elementÂ
        // Iterate over the sorted array        for (int i = 1; i < N; i++)        {            if (arr[i] == arr[i - 1])            {                currFreq++; // Increment the frequency if the current element is the same as the previous element            }            else            {                // If the frequency of the current element is less than minFreq, update minFreq and maxElement                if (currFreq <= minFreq)                {                    minFreq = currFreq;                    maxElement = arr[i - 1];                }                currFreq = 1; // Reset the frequency for the new element            }        }Â
        // Check the frequency of the last element        if (currFreq <= minFreq)        {            minFreq = currFreq;            maxElement = arr[N - 1];        }Â
        return maxElement; // Return the maximum element with the minimum frequency    }Â
    static void Main()    {        int[] arr = { 2, 2, 5, 50, 1 };        int N = arr.Length;        Console.WriteLine(MaxElementWithMinFreq(arr, N));    }} |
Javascript
function maxElementWithMinFreq(arr) {Â Â Â Â arr.sort(); // Sort the array in non-decreasing orderÂ
    let minFreq = arr.length + 1; // Initialize minFreq to a value greater than the array size    let maxElement = arr[0]; // Initialize maxElement to the first element of the sorted array    let currFreq = 1; // Keep track of the frequency of the current elementÂ
    // Iterate over the sorted array    for (let i = 1; i < arr.length; i++) {        if (arr[i] == arr[i - 1]) {            currFreq++; // Increment the frequency if the current element is the same as the previous element        } else {            // If the frequency of the current element is less than minFreq, update minFreq and maxElement            if (currFreq <= minFreq) {                minFreq = currFreq;                maxElement = arr[i - 1];            }            currFreq = 1; // Reset the frequency for the new element        }    }Â
    // Check the frequency of the last element    if (currFreq <= minFreq) {        minFreq = currFreq;        maxElement = arr[arr.length - 1];    }Â
    return maxElement; // Return the maximum element with the minimum frequency}Â
const arr = [2, 2, 5, 50, 1];console.log(maxElementWithMinFreq(arr)); |
50
Time Complexity: O(N*log(N))
Auxiliary Space: O(1)
Approach: The given problem can be solved by storing the frequency of the array element in a HashMap and then finding the maximum value having a minimum frequency. Follow the steps below to solve the given problem:
- Store the frequency of each element in a HashMap, say M.
- Initialize two variables, say maxValue as INT_MIN and minFreq as INT_MAX that store the resultant maximum element and stores the minimum frequency among all the frequencies.
- Iterate over the map M and perform the following steps:
- If the frequency of the current element is less than minFreq then update the value of minFreq to the current frequency and the value of maxValue to the current element.
- If the frequency of the current element is equal to the minFreq and the value of maxValue is less than the current value  then update the value of maxValue to the current element.
- After completing the above steps, print the value of maxValue as the resultant element.
Below is the implementation of the above approach:
C++
// C++ program for the above approachÂ
#include <bits/stdc++.h>using namespace std;Â
// Function to find the maximum element// with the minimum frequencyint maxElementWithMinFreq(int* arr, int N){    // Stores the frequency of array    // elements    unordered_map<int, int> mp;Â
    // Find the frequency and store    // in the map    for (int i = 0; i < N; i++) {        mp[arr[i]]++;    }Â
    // Initialize minFreq to the maximum    // value and minValue to the minimum    int minFreq = INT_MAX;    int maxValue = INT_MIN;Â
    // Traverse the map mp    for (auto x : mp) {Â
        int num = x.first;        int freq = x.second;Â
        // If freq < minFreq, then update        // minFreq to freq and maxValue        // to the current element        if (freq < minFreq) {            minFreq = freq;            maxValue = num;        }Â
        // If freq is equal to the minFreq        // and current element > maxValue        // then update maxValue to the        // current element        else if (freq == minFreq                 && maxValue < num) {            maxValue = num;        }    }Â
    // Return the resultant maximum value    return maxValue;}Â
// Driver Codeint main(){Â Â Â Â int arr[] = { 2, 2, 5, 50, 1 };Â Â Â Â int N = sizeof(arr) / sizeof(arr[0]);Â Â Â Â cout << maxElementWithMinFreq(arr, N);Â
    return 0;} |
Java
// Java program for the above approachimport java.util.*;Â
class GFG{Â
// Function to find the maximum element// with the minimum frequencystatic int maxElementWithMinFreq(int[] arr, int N){       // Stores the frequency of array    // elements    HashMap<Integer,Integer> mp = new HashMap<Integer,Integer>();Â
    // Find the frequency and store    // in the map    for (int i = 0; i < N; i++) {        if(mp.containsKey(arr[i])){            mp.put(arr[i], mp.get(arr[i])+1);        }else{            mp.put(arr[i], 1);    }    }Â
    // Initialize minFreq to the maximum    // value and minValue to the minimum    int minFreq = Integer.MAX_VALUE;    int maxValue = Integer.MIN_VALUE;Â
    // Traverse the map mp    for (Map.Entry<Integer,Integer> x : mp.entrySet()){Â
        int num = x.getKey();        int freq = x.getValue();Â
        // If freq < minFreq, then update        // minFreq to freq and maxValue        // to the current element        if (freq < minFreq) {            minFreq = freq;            maxValue = num;        }Â
        // If freq is equal to the minFreq        // and current element > maxValue        // then update maxValue to the        // current element        else if (freq == minFreq                 && maxValue < num) {            maxValue = num;        }    }Â
    // Return the resultant maximum value    return maxValue;}Â
// Driver Codepublic static void main(String[] args){Â Â Â Â int arr[] = { 2, 2, 5, 50, 1 };Â Â Â Â int N = arr.length;Â Â Â Â System.out.print(maxElementWithMinFreq(arr, N));Â
}}Â
// This code is contributed by shikhasingrajput |
Python3
# Python 3 program for the above approachimport sysfrom collections import defaultdictÂ
# Function to find the maximum element# with the minimum frequencydef maxElementWithMinFreq(arr, N):Â
    # Stores the frequency of array    # elements    mp = defaultdict(int)Â
    # Find the frequency and store    # in the map    for i in range(N):        mp[arr[i]] += 1Â
    # Initialize minFreq to the maximum    # value and minValue to the minimum    minFreq = sys.maxsize    maxValue = -sys.maxsize-1Â
    # Traverse the map mp    for x in mp:Â
        num = x        freq = mp[x]Â
        # If freq < minFreq, then update        # minFreq to freq and maxValue        # to the current element        if (freq < minFreq):            minFreq = freq            maxValue = numÂ
        # If freq is equal to the minFreq        # and current element > maxValue        # then update maxValue to the        # current element        elif (freq == minFreq              and maxValue < num):            maxValue = numÂ
    # Return the resultant maximum value    return maxValueÂ
# Driver Codeif __name__ == "__main__":Â
    arr = [2, 2, 5, 50, 1]    N = len(arr)    print(maxElementWithMinFreq(arr, N))Â
    # This code is contributed by ukasp. |
C#
// C# program for the above approachusing System;using System.Collections.Generic;Â
class GFG{Â
// Function to find the maximum element// with the minimum frequencystatic int maxElementWithMinFreq(int []arr, int N){       // Stores the frequency of array    // elements    Dictionary<int, int> mp = new Dictionary<int,int>();Â
    // Find the frequency and store    // in the map    for (int i = 0; i < N; i++) {        if(mp.ContainsKey(arr[i]))        mp[arr[i]]++;        else          mp.Add(arr[i],1);    }Â
    // Initialize minFreq to the maximum    // value and minValue to the minimum    int minFreq = Int32.MaxValue;    int maxValue = Int32.MinValue;Â
    // Traverse the map mp    foreach(KeyValuePair<int,int> x in mp) {Â
        int num = x.Key;        int freq = x.Value;Â
        // If freq < minFreq, then update        // minFreq to freq and maxValue        // to the current element        if (freq < minFreq) {            minFreq = freq;            maxValue = num;        }Â
        // If freq is equal to the minFreq        // and current element > maxValue        // then update maxValue to the        // current element        else if (freq == minFreq                 && maxValue < num) {            maxValue = num;        }    }Â
    // Return the resultant maximum value    return maxValue;}Â
// Driver Codepublic static void Main(){Â Â Â Â int []arr = { 2, 2, 5, 50, 1 };Â Â Â Â int N = arr.Length;Â Â Â Â Console.Write(maxElementWithMinFreq(arr, N));}}Â
// This code is contributed by SURENDRA_GANGWAR. |
Javascript
<script>        // JavaScript Program to implement        // the above approachÂ
        // Function to find the maximum element        // with the minimum frequency        function maxElementWithMinFreq(arr, N) {            // Stores the frequency of array            // elements            let mp = new Map();Â
            // Find the frequency and store            // in the 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);                }Â
            }Â
            // Initialize minFreq to the maximum            // value and minValue to the minimum            let minFreq = Number.MAX_VALUE            let maxValue = Number.MIN_VALUE;Â
            // Traverse the map mp            for (let [key, value] of mp) {Â
                let num = key;                let freq = value;Â
                // If freq < minFreq, then update                // minFreq to freq and maxValue                // to the current element                if (freq < minFreq) {                    minFreq = freq;                    maxValue = num;                }Â
                // If freq is equal to the minFreq                // and current element > maxValue                // then update maxValue to the                // current element                else if (freq == minFreq                    && maxValue < num) {                    maxValue = num;                }            }Â
            // Return the resultant maximum value            return maxValue;        }Â
        // Driver CodeÂ
        let arr = [2, 2, 5, 50, 1];        let N = arr.length;        document.write(maxElementWithMinFreq(arr, N));Â
// This code is contributed by Potta Lokesh    </script> |
50
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
