1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class FrequencyTracker {
private final Map<Integer, Integer> numToFreqMap; private final Map<Integer, Integer> freqToCountMap;
public FrequencyTracker() { this.numToFreqMap = new HashMap<>(); this.freqToCountMap = new HashMap<>(); }
public void add(int number) { int prevFreq = numToFreqMap.getOrDefault(number, 0); int currFreq = prevFreq + 1; numToFreqMap.put(number, currFreq);
updateFreqCount(prevFreq, -1); updateFreqCount(currFreq, +1); }
private void updateFreqCount(int freq, int offset) { int prevCount = freqToCountMap.getOrDefault(freq, 0); int currCount = prevCount + offset; if (currCount == 0) { freqToCountMap.remove(freq); } else { freqToCountMap.put(freq, currCount); } }
public void deleteOne(int number) { int prevFreq = numToFreqMap.getOrDefault(number, 0); int currFreq = prevFreq - 1;
if (prevFreq == 0) { return; } numToFreqMap.put(number, currFreq);
updateFreqCount(prevFreq, -1); updateFreqCount(currFreq, +1); }
public boolean hasFrequency(int frequency) { return freqToCountMap.getOrDefault(frequency, 0) > 0; }
}
|