Given an arr[] of size N and an integer, K, the task is to find the maximum possible value of MEX by adding or subtracting K any number of times from the array elements.
MEX is the minimum non-negative integer that is not present in the array
Examples:
Input: arr[]={1, 3, 4}, K = 2
Output: 2
Explanation: After subtracting K from arr[2] twice, Â
the final array will be {1, 3, 0}.Â
So the MEX is 2 which is maximum possible answer.Input: arr[] = {0, 1, 2, 1, 3}, K = 3
Output: 5
Explanation: After adding K to arr[1], the final array will be {0, 4, 2, 1, 3}.Â
So the MEX is 5 which is maximum possible answer.
Approach: Follow the below idea to solve the problem:
The maximum MEX which can be achieved from an array of size N is N. For this, we need to have all the elements from 0 to N – 1 by doing some operations.  If there is a number that is not achievable by doing some operation then this is the answer.Â
We can generate a number x from a number p by doing addition or subtraction if both remainders are same by diving it with K [i.e., the difference between them is divisible by K].
Follow the steps to solve the problem:
- Create a map that stores the frequency of the remainder of all the elements of the array.
- Traverse from 0 to N-1 and check if there is a need to generate the number x then x % K must be present in the map.
- If it is present in the map then decrease the frequency of x % K and continue.
- Else, return the number as the answer.
Below is the implementation for the above approach:
C++
// C++ code for the above approach Â
#include <bits/stdc++.h> using namespace std; Â
// Function to find maximum MEX of the array // after doing some addition and subtraction int mex( int arr[], int n, int K) {     // Create a map to store the frequency of     // remainder of all element by K     unordered_map< int , int > mp; Â
    for ( int i = 0; i < n; i++) {         mp[arr[i] % K]++;     } Â
    for ( int i = 0; i < n; i++) { Â
        // In order to generate i find an         // element whose modulo value is equal         // to i%K, return i as answer if no         // such value is found         if (mp.find(i % K) == mp.end()) {             return i;         } Â
        // If we find element whose modulo         // value equal to i%K         mp[i % K]--;         if (mp[i % K] == 0)             mp.erase(i % K);     } Â
    return n; } Â
// Driver code int main() { Â Â Â Â int arr[] = { 0, 1, 2, 1, 3 }; Â Â Â Â int N = sizeof (arr) / sizeof (arr[0]); Â Â Â Â int K = 3; Â
    // Function call     cout << mex(arr, N, K) << endl;     return 0; } |
Java
/*package whatever //do not write package name here */ import java.io.*; import java.util.*; import java.util.HashMap; Â
class GFG { Â
    // Function to find maximum MEX of the array     // after doing some addition and subtraction     public static int mex( int [] arr, int n, int K)     { Â
        Map<Integer, Integer> mp             = new HashMap<Integer, Integer>(); Â
        for ( int v : arr) {             mp.putIfAbsent(v % K, 0 );             mp.put(v % K, mp.get(v % K) + 1 );         } Â
        for ( int i = 0 ; i < n; i++) {             if (!mp.containsKey(i % K)) {                 return i;             } Â
            mp.put(i % K, mp.get(i % K) - 1 ); Â
            if (mp.get(i % K) <= 0 ) {                 mp.remove(i % K);             }         }         return n;     } Â
    public static void main(String[] args)     {         int arr[] = { 0 , 1 , 2 , 1 , 3 };         int N = arr.length;         int K = 3 ; Â
        // Function call         System.out.println(mex(arr, N, K));     } } Â
// This code is contributed by akashish__ |
Python3
# Python code to implement the approach from collections import defaultdict Â
# Function to find maximum MEX of the array # after doing some addition and subtraction def mex(arr, n, K) :          # Create a map to store the frequency of     # remainder of all element by K     mp = defaultdict( lambda : 0 )       # Traverse the array     for i in range (n):           # Update frequency of arr[i]         mp[arr[i] % K] + = 1 ;          for i in range (n): Â
        # In order to generate i find an         # element whose modulo value is equal         # to i%K, return i as answer if no         # such value is found         if ((i % K) not in mp) :             return i                  # If we find element whose modulo         # value equal to i%K         mp[i % K] - = 1         if (mp[i % K] = = 0 ) :             del mp[i % K]          return n Â
# Driver code if __name__ = = "__main__" : Â Â Â Â Â Â Â Â Â arr = [ 0 , 1 , 2 , 1 , 3 ] Â Â Â Â N = len (arr) Â Â Â Â K = 3 Â
    # Function call     print (mex(arr, N, K)) Â
# This code is contributed by sanjoy_62. |
C#
/*package whatever //do not write package name here */ using System; using System.Collections.Generic; Â
public class GFG { Â
  // Function to find maximum MEX of the array   // after doing some addition and subtraction   public static int mex( int [] arr, int n, int K)   {          // Create a map to store the frequency of     // remainder of all element by K     Dictionary< int , int > mp       = new Dictionary< int , int >(); Â
    for ( int i = 0; i < n; i++) {       mp.Add(i, 0);     }     for ( int i = 0; i < n; i++) {         if (mp.ContainsKey(arr[i] % K))               mp[mp[arr[i] % K]]=              mp[arr[i] % K] + 1;         else             mp.Add(mp[arr[i] % K],                1);     } Â
    for ( int i = 0; i < n; i++) { Â
      // In order to generate i find an       // element whose modulo value is equal       // to i%K, return i as answer if no       // such value is found       if (mp[i%K] > 1 ){         return i;       } Â
      // If we find element whose modulo       // value equal to i%K     if (mp.ContainsKey(arr[i] % K))       mp[mp[arr[i] % K]]=              mp[arr[i] % K] - 1;       if (mp.ContainsKey(i % K) && mp[i % K] <= 0)         mp[mp[arr[i] % K]]=                0;     }     return n;   } Â
  public static void Main(String[] args)   {     int []arr = { 0, 1, 2, 1, 3 };     int N = arr.Length;     int K = 3; Â
    // Function call     Console.WriteLine(mex(arr, N, K));   } } Â
Â
// This code contributed by shikhasingrajput |
Javascript
  <script> // Javascript code for the above approach Â
// Function to find maximum MEX of the array // after doing some addition and subtraction function mex(arr,n,K) {     // Create a map to store the frequency of     // remainder of all element by K         let mp= new Map();     for (let i = 0; i < n; i++) {         mp[arr[i] % K]++;     } Â
    for (let i = 0; i < n; i++) { Â
        // In order to generate i find an         // element whose modulo value is equal         // to i%K, return i as answer if no         // such value is found         if (mp.has(i % K)) {             return i;         } Â
        // If we find element whose modulo         // value equal to i%K         mp[i % K]--;         if (mp[i % K] == 0)             mp. delete (i % K);     } Â
    return n; } Â
// Driver code Â
    let arr = [ 0, 1, 2, 1, 3 ];     let N = arr.length;     let K = 3; Â
    // Function call     document.write(mex(arr, N, K));          // This code is contributed by satwik4409.     </script> |
5
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!