2671 频率跟踪器(Medium)

请你设计并实现一个能够对其中的值进行跟踪的数据结构,并支持对频率相关查询进行应答。

实现 FrequencyTracker 类:

FrequencyTracker():使用一个空数组初始化 FrequencyTracker 对象。

void add(int number):添加一个 number 到数据结构中。

void deleteOne(int number):从数据结构中删除一个 number 。数据结构 可能不包含 number ,在这种情况下不删除任何内容。

bool hasFrequency(int frequency): 如果数据结构中存在出现 frequency 次的数字,则返回 true,否则返回 false。

示例 1:

输入

[“FrequencyTracker”, “add”, “add”, “hasFrequency”]

[[], [3], [3], [2]]

输出

[null, null, null, true]

解释

FrequencyTracker frequencyTracker = new FrequencyTracker();

frequencyTracker.add(3); // 数据结构现在包含 [3]

frequencyTracker.add(3); // 数据结构现在包含 [3, 3]

frequencyTracker.hasFrequency(2); // 返回 true ,因为 3 出现 2 次

双哈希

一个用来存频率,一个用来存频率的频率

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class FrequencyTracker {
private HashMap<Integer,Integer> hashMap;
private TreeMap<Integer,Integer> treeMap;

public FrequencyTracker() {
hashMap = new HashMap<>();
treeMap = new TreeMap<>();
}

public void add(int number) {
if (!hashMap.containsKey(number)){
hashMap.put(number,1);
treeMap.put(1,treeMap.getOrDefault(1,0)+1);
}
else {
Integer integer = hashMap.get(number);
hashMap.put(number,integer+1);
if (treeMap.containsKey(integer)){
int count = treeMap.get(integer);
if (count == 1){
treeMap.remove(integer);
}
else{
treeMap.replace(integer,count-1);
}
treeMap.put(integer+1,treeMap.getOrDefault(integer+1,0)+1);
}
}
}

public void deleteOne(int number) {

if (hashMap.containsKey(number)){
int i1 = hashMap.get(number);
int temp = treeMap.get(i1);
if (temp == 1){
treeMap.remove(i1);
}
else {
treeMap.replace(i1,temp-1);
}
if (i1-1 !=0){
if (treeMap.containsKey(i1-1)){
treeMap.put(i1-1,treeMap.get(i1-1)+1);
}
else {
treeMap.put(i1-1,1);
}
}

if (i1 == 1){
hashMap.remove(number);
}
else {
hashMap.put(number,i1-1);
}

}
}

public boolean hasFrequency(int frequency) {

if (treeMap.containsKey(frequency)){
int temp = treeMap.get(frequency);
if (temp > 0){
return true;
}
else {
return false;
}
}
else {
return false;
}
}

public static void main(String[] args) {
FrequencyTracker frequencyTracker = new FrequencyTracker();

frequencyTracker.add(2);

frequencyTracker.add(7);

frequencyTracker.add(7);
frequencyTracker.add(3);
frequencyTracker.add(3);

frequencyTracker.deleteOne(7);
frequencyTracker.deleteOne(7);
System.out.println(frequencyTracker.hasFrequency(2));
System.out.println(frequencyTracker.hasFrequency(1));
}

}