![](https://img-blog.csdnimg.cn/926204648ec34eb081c93951c0e6f830.png)
![](https://img-blog.csdnimg.cn/bd918677c4e34764a3014134d262de13.png)
![](https://img-blog.csdnimg.cn/56db40f87c934ef88552c52217bafc49.png)
思路:
- FrequencyTracker():初始化 map 集合 和 nums 数组,map 记录数字 number出现了几次,nums [ i ] 记录出现 i 次的数字有多少个。
- void add(int number):添加 number 到 map,然后将 number 出现的次数 map.get(number) 为下标 i ,传到 nums [ i ]++。
- void deleteOne(int number):先判断 number 是否存在 map 中,如果有将其出现的次数 map.get(number) 减 1,同时 nums [map.get(number)] 减一,如果减完了就可以删除 key。否则 nums [map.get(number) - 1 ] ++。
- bool hasFrequency(int frequency):直接以出现的次数 frequency 为下标,即可直接得出 frequency 次的数字个数,与 0 做判断即可。
class FrequencyTracker {
private Map<Integer,Integer> map;
private int[] nums;
public FrequencyTracker() {
map = new HashMap<>();
nums = new int[100002];
}
public void add(int number) {
var isExist = map.get(number);
if(isExist == null){
map.put(number,1);
isExist = 1;
}else{
nums[isExist]--;
map.replace(number,++isExist);
}
nums[isExist]++;
}
public void deleteOne(int number) {
var isExist = map.get(number);
if(isExist != null){
nums[isExist]--;
if(isExist == 1){
map.remove(number);
return;
}
map.replace(number,--isExist);
nums[isExist]++;
}
}
public boolean hasFrequency(int frequency) {
return nums[frequency] != 0;
}
}