<p>You are given a <strong>0-indexed</strong> integer array <code>nums</code> and an integer <code>value</code>.</p>

<p>In one operation, you can add or subtract <code>value</code> from any element of <code>nums</code>.</p>

<ul>
	<li>For example, if <code>nums = [1,2,3]</code> and <code>value = 2</code>, you can choose to subtract <code>value</code> from <code>nums[0]</code> to make <code>nums = [-1,2,3]</code>.</li>
</ul>

<p>The MEX (minimum excluded) of an array is the smallest missing <strong>non-negative</strong> integer in it.</p>

<ul>
	<li>For example, the MEX of <code>[-1,2,3]</code> is <code>0</code> while the MEX of <code>[1,0,3]</code> is <code>2</code>.</li>
</ul>

<p>Return <em>the maximum MEX of </em><code>nums</code><em> after applying the mentioned operation <strong>any number of times</strong></em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,-10,7,13,6,8], value = 5
<strong>Output:</strong> 4
<strong>Explanation:</strong> One can achieve this result by applying the following operations:
- Add value to nums[1] twice to make nums = [1,<strong><u>0</u></strong>,7,13,6,8]
- Subtract value from nums[2] once to make nums = [1,0,<strong><u>2</u></strong>,13,6,8]
- Subtract value from nums[3] twice to make nums = [1,0,2,<strong><u>3</u></strong>,6,8]
The MEX of nums is 4. It can be shown that 4 is the maximum MEX we can achieve.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,-10,7,13,6,8], value = 7
<strong>Output:</strong> 2
<strong>Explanation:</strong> One can achieve this result by applying the following operation:
- subtract value from nums[2] once to make nums = [1,-10,<u><strong>0</strong></u>,13,6,8]
The MEX of nums is 2. It can be shown that 2 is the maximum MEX we can achieve.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length, value &lt;= 10<sup>5</sup></code></li>
	<li><code>-10<sup>9</sup> &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

from collections import Counter
class Solution:
    def findSmallestInteger(self, nums: List[int], value: int) -> int:
        """
        MEX is the minimum non-negative number (0,1,...) which cannot be formed by adding/subtracting 
        the value to each element of the array nums
        """

        # mod is the king operator here
        # first let's get the mod of all values in the list
        # this will give us a list with values between 0 & value
        nums_mod_val = [i % value for i in nums] # O(n)
        print(nums_mod_val)

        # now lets create a counter of these in a map
        # to allow for O(1) access
        nums_mod_count_map = defaultdict(int)
        nums_mod_count_map = Counter(nums_mod_val) # O(n)

        # now find the MEX from the map
        for i in range(len(nums)): # O(n)
            num_count = nums_mod_count_map.get(i, None) # O(1)
            if num_count == None:
                # this is our MEX
                return i
            else:
                # if the count for a number is more than 1, then use 1
                # and add value to the others and store back in the map
                nums_mod_count_map[i] -= 1
                for j in range(1, num_count):
                    # add value*j to i and store it back in the map
                    # as this would be the case if we had to get all
                    # counts=1
                    nums_mod_count_map[i] -= 1
                    nums_mod_count_map[i + (value*j)] += 1
        
        # if we get till here, we have exhausted the list and all operations
        # so the MEX is length of the list
        return len(nums)
        
38800