Maximum Equal Frequency LeetCode solution in Java

1
import java.util.NavigableMap;
2
import java.util.TreeMap;
3

4
class Solution {
5
public int maxEqualFreq(int[] nums) {
6
Map<Integer, Integer> F = new HashMap<>(); // Frequencies
7
NavigableMap<Integer, Integer> V = new TreeMap<>(); // Values for frequencies
8
int max = 0;
9
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;
15
}
16
return max + 1;
17
}
18

19
public boolean isPossibleToRemove(NavigableMap<Integer, Integer> frequenciesMap) {
20
if (frequenciesMap.size() > 2) return false; // more than 2 different frequencies
21
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;
28
return true;
29
}
30

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 1
33
// if there are more than 1 occurences of such frequency, removing 1 element will not change it
34
public int removeElement(Map.Entry<Integer, Integer> frequencyValue) {
35
if (frequencyValue.getValue() == 1) return frequencyValue.getKey() - 1;
36
return frequencyValue.getKey();
37
}
38

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);
43
}
44

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);
48
}
49
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0