Maximum frequencies in each M-length subarray

Given an array arr[] consisting of N integers and a positive integer M, the task is to find the maximum frequency for each M-length subarray ( 0 < M ? N).
Examples:
Input: arr[] = {1, 2, 3, 1, 2, 4, 1, 4, 4}, M = 4
Output: 2 2 1 2 2 3
Explanation:
All the M length sub-arrays with the maximum frequency of any element are:
- {1, 2, 3, 1}, The maximum frequency of an element is 2.
- {2, 3, 1, 2}, The maximum frequency of an element is 2.
- {3, 1, 2, 4}, The maximum frequency of an element is 1.
- {1, 2, 4, 1}, The maximum frequency of an element is 2.
- {2, 4, 1, 4}, The maximum frequency of an element is 2.
- {4, 1, 4, 4}, The maximum frequency of an element is 3.
Input: arr[] = {1, 1, 2, 2, 3, 5}, M = 4
Output: 2 2 2
Approach: The given problem can be solved by finding the frequencies for each M-sized sub-array print the maximum frequency among all. Follow the steps below to solve the given problem:
- Initialize an unordered map, say M to stores the frequencies of array elements.
- Initialize the variable, say val as 0 to store the maximum frequency of an element of the subarray.
- Iterate over the range [0, N] using the variable i and perform the following steps:
- If the value of (i – M) is greater than equal to 0, then decrease the value of A[i – M] from the map M.
- Add the value of arr[i] in the map M.
- Iterate over the map M and update the value of val as the maximum of val or x.second.
- Print the value of val as the maximum for the present M-sized subarray.
Below is an implementation of the above approach:
C++
// C++ program for the above approachÂ
#include <bits/stdc++.h>using namespace std;Â
// Function to find the frequency of// the most common element in each M// length subarraysvoid maxFrequencySubarrayUtil(Â Â Â Â vector<int> A, int N, int M){Â Â Â Â int i = 0;Â
    // Stores frequency of array element    unordered_map<int, int> m;Â
    // Stores the maximum frequency    int val = 0;Â
    // Iterate for the first sub-array    // and store the maximum    for (; i < M; i++) {        m[A[i]]++;        val = max(val, m[A[i]]);    }Â
    // Print the maximum frequency for    // the first subarray    cout << val << " ";Â
    // Iterate over the range [M, N]    for (i = M; i < N; i++) {Â
        // Subtract the A[i - M] and        // add the A[i] in the map        m[A[i - M]]--;        m[A[i]]++;Â
        val = 0;Â
        // Find the maximum frequency        for (auto x : m) {            val = max(val, x.second);        }Â
        // Print the maximum frequency        // for the current subarray        cout << val << " ";    }}Â
// Driver Codeint main(){Â Â Â Â vector<int> A = { 1, 1, 2, 2, 3, 5 };Â Â Â Â int N = A.size();Â Â Â Â int M = 4;Â Â Â Â maxFrequencySubarrayUtil(A, N, M);Â
    return 0;} |
Java
// Java program for the above approachÂ
import java.util.*;Â
class GFG {Â
    // Function to find the frequency of    // the most common element in each M    // length subarrays    static void maxFrequencySubarrayUtil(int[] A, int N, int M) {        int i = 0;Â
        // Stores frequency of array element        HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();Â
        // Stores the maximum frequency        int val = 0;Â
        // Iterate for the first sub-array        // and store the maximum        for (; i < M; i++) {            if (m.containsKey(A[i])) {                m.put(A[i], m.get(A[i]) + 1);            } else {                m.put(A[i], 1);            }            val = Math.max(val, m.get(A[i]));        }Â
        // Print the maximum frequency for        // the first subarray        System.out.print(val + " ");Â
        // Iterate over the range [M, N]        for (i = M; i < N; i++) {Â
            // Subtract the A[i - M] and            // add the A[i] in the map            if (m.containsKey(i - M)) {                m.put(i - M, m.get(i - M) - 1);            }            if (m.containsKey(A[i])) {                m.put(A[i], m.get(A[i]) + 1);            } else {                m.put(A[i], 1);            }Â
            val = 0;Â
            // Find the maximum frequency            for (Map.Entry<Integer, Integer> x : m.entrySet()) {                val = Math.max(val, x.getValue());            }Â
            // Print the maximum frequency            // for the current subarray            System.out.print(val + " ");        }    }Â
    // Driver Code    public static void main(String[] args) {        int[] A = { 1, 1, 2, 2, 3, 5 };        int N = A.length;        int M = 4;        maxFrequencySubarrayUtil(A, N, M);Â
    }}Â
// This code is contributed by 29AjayKumar |
Python3
# Python 3 program for the above approachÂ
# Function to find the frequency of# the most common element in each M# length subarraysdef maxFrequencySubarrayUtil(A,N,M):Â Â Â Â i = 0Â
    # Stores frequency of array element    m = {}Â
    # Stores the maximum frequency    val = 0Â
    # Iterate for the first sub-array    # and store the maximum    while(i < M):        if A[i] in m:            m[A[i]] += 1        else:            m[A[i]] = 1        val = max(val, m[A[i]])        i += 1Â
    # Print the maximum frequency for    # the first subarray    print(val,end = " ")Â
    # Iterate over the range [M, N]    for i in range(M,N,1):        # Subtract the A[i - M] and        # add the A[i] in the map        if A[i - M] in m:            m[A[i - M]] -= 1        else:            m[A[i - M]] = 0        if A[i] in m:            m[A[i]] += 1Â
        val = 0Â
        # Find the maximum frequency        for key,value in m.items():            val = max(val, value)Â
        # Print the maximum frequency        # for the current subarray        print(val,end=" ")Â
# Driver Codeif __name__ == '__main__':Â Â Â Â A = [1, 1, 2, 2, 3, 5]Â Â Â Â N = len(A)Â Â Â Â M = 4Â Â Â Â maxFrequencySubarrayUtil(A, N, M)Â Â Â Â Â Â Â Â Â # This code is contributed by ipg2016107. |
C#
using System;using System.Collections.Generic;public class GFG {Â
    // Function to find the frequency of    // the most common element in each M    // length subarrays    static void maxFrequencySubarrayUtil(int[] A, int N,                                         int M)    {        int i = 0;Â
        // Stores frequency of array element        Dictionary<int, int> m = new Dictionary<int, int>();        // Stores the maximum frequency        int val = 0;Â
        // Iterate for the first sub-array        // and store the maximum        for (; i < M; i++) {            if (m.ContainsKey(A[i])) {                val = m[A[i]];                m.Remove(A[i]);                m.Add(A[i], val + 1);            }            else {                m.Add(A[i], 1);            }            val = Math.Max(val, m[A[i]]);        }Â
        // Print the maximum frequency for        // the first subarray        Console.Write(val + " ");Â
        // Iterate over the range [M, N]        for (i = M; i < N; i++) {Â
            // Subtract the A[i - M] and            // add the A[i] in the map            if (m.ContainsKey(i - M)) {                val = i - M;                m.Remove(i - M);                m.Add(i - M, val - 1);            }           if (m.ContainsKey(A[i])) {                val = m[A[i]];                m.Remove(A[i]);                m.Add(A[i], val + 1);            }            else {                m.Add(A[i], 1);            }                         val = Math.Max(val, m[A[i]]);         Â
        val = 0;Â
        // Find the maximum frequency        foreach(KeyValuePair<int, int> x in m)        {Â
            val = Math.Max(val, x.Value);        }Â
        // Print the maximum frequency        // for the current subarray        Console.Write(val + " ");        }}Â
// Driver CodeÂ
static public void Main(){Â Â Â Â int[] A = { 1, 1, 2, 2, 3, 5 };Â Â Â Â int N = 6;Â Â Â Â int M = 4;Â Â Â Â maxFrequencySubarrayUtil(A, N, M);}}Â
// This code is contributed by maddler. |
Javascript
<script>        // JavaScript Program to implement        // the above approachÂ
        // Function to find the frequency of        // the most common element in each M        // length subarrays        function maxFrequencySubarrayUtil(A, N, M)         {Â
            // Stores frequency of array element            let m = new Map();Â
            // Stores the maximum frequency            let val = 0;Â
            // Iterate for the first sub-array            // and store the maximum            for (let i = 0; i < M; i++) {Â
                if (m.has(A[i])) {                    m.set(m.get(A[i]), m.get(A[i]) + 1);                }                else {                    m.set(A[i], 1);                }                val = Math.max(val, m.get(A[i]));            }Â
            // Print the maximum frequency for            // the first subarray            document.write(val + " ");Â
            // Iterate over the range [M, N]            for (i = M; i < N; i++) {Â
                // Subtract the A[i - M] and                // add the A[i] in the map                if (m.has(A[i - m]))                    m.set(m.get(A[i - M]), m.get(A[i - M]) - 1);                if (m.has(A[i]))                    m.set(m.get(A[i]), m.get(A[i]) + 1);Â
                val = 0;Â
                // Find the maximum frequency                for (let [key, value] of m) {                    val = Math.max(val, value);                }Â
                // Print the maximum frequency                // for the current subarray                document.write(val + " ");            }        }Â
        // Driver Code        let A = [1, 1, 2, 2, 3, 5];        let N = A.length;        let M = 4;        maxFrequencySubarrayUtil(A, N, M);Â
// This code is contributed by Potta Lokesh    </script> |
Output:Â
2 2 2
Â
Time Complexity: O(N*M)
Auxiliary Space: O(M)
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



