1
import java.util.NavigableMap;2
import java.util.TreeMap;5
public int maxEqualFreq(int[] nums) {6
Map<Integer, Integer> F = new HashMap<>(); // Frequencies7
NavigableMap<Integer, Integer> V = new TreeMap<>(); // Values for frequencies9
for (int i = 0; i < nums.length; i++) {10
increaseCount(F, nums[i]);11
int frequency = F.get(nums[i]);12
decreaseCount(V, frequency - 1);13
increaseCount(V, frequency);14
if (isPossibleToRemove(V)) max = i;19
public boolean isPossibleToRemove(NavigableMap<Integer, Integer> frequenciesMap) {20
if (frequenciesMap.size() > 2) return false; // more than 2 different frequencies21
Map.Entry<Integer, Integer> first = frequenciesMap.firstEntry();22
Map.Entry<Integer, Integer> last = frequenciesMap.lastEntry();23
if (frequenciesMap.size() == 1)24
return first.getKey() == 1 || first.getValue() == 1; // should be [a,a,a,a] or [a,b,c,d]25
int firstReduced = removeElement(first);26
int lastReduced = removeElement(last);27
if (firstReduced > 0 && lastReduced > 0 && first.getKey() != lastReduced) return false;31
// Try to remove element which contributes to this frequency:32
// if there's only 1 occurence of such frequency, the frequency itself will become smaller by 133
// if there are more than 1 occurences of such frequency, removing 1 element will not change it34
public int removeElement(Map.Entry<Integer, Integer> frequencyValue) {35
if (frequencyValue.getValue() == 1) return frequencyValue.getKey() - 1;36
return frequencyValue.getKey();39
public void decreaseCount(Map<Integer, Integer> map, int element) {40
if (!map.containsKey(element)) return;41
map.put(element, map.get(element) - 1);42
if (map.get(element) == 0) map.remove(element);45
public void increaseCount(Map<Integer, Integer> map, int element) {46
if (!map.containsKey(element)) map.put(element, 0);47
map.put(element, map.get(element) + 1);