# LC 2671. Frequency Tracker
### [Problem link](https://leetcode.com/problems/frequency-tracker/)
###### tags: `leedcode` `python` `medium`
Design a data structure that keeps track of the values in it and answers some queries regarding their frequencies.
Implement the <code>FrequencyTracker</code> class.
- <code>FrequencyTracker()</code>: Initializes the <code>FrequencyTracker</code> object with an empty array initially.
- <code>void add(int number)</code>: Adds <code>number</code> to the data structure.
- <code>void deleteOne(int number)</code>: Deletes **one** occurrence of <code>number</code> from the data structure. The data structure **may not contain** <code>number</code>, and in this case nothing is deleted.
- <code>bool hasFrequency(int frequency)</code>: Returns <code>true</code> if there is a number in the data structure that occurs <code>frequency</code> number of times, otherwise, it returns <code>false</code>.
**Example 1:**
```
Input
["FrequencyTracker", "add", "add", "hasFrequency"]
[[], [3], [3], [2]]
Output
[null, null, null, true]
Explanation
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(3); // The data structure now contains [3]
frequencyTracker.add(3); // The data structure now contains [3, 3]
frequencyTracker.hasFrequency(2); // Returns true, because 3 occurs twice
```
**Example 2:**
```
Input
["FrequencyTracker", "add", "deleteOne", "hasFrequency"]
[[], [1], [1], [1]]
Output
[null, null, null, false]
Explanation
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(1); // The data structure now contains [1]
frequencyTracker.deleteOne(1); // The data structure becomes empty []
frequencyTracker.hasFrequency(1); // Returns false, because the data structure is empty
```
**Example 3:**
```
Input
["FrequencyTracker", "hasFrequency", "add", "hasFrequency"]
[[], [2], [3], [1]]
Output
[null, false, null, true]
Explanation
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.hasFrequency(2); // Returns false, because the data structure is empty
frequencyTracker.add(3); // The data structure now contains [3]
frequencyTracker.hasFrequency(1); // Returns true, because 3 occurs once
```
**Constraints:**
- <code>1 <= number <= 10<sup>5</sup></code>
- <code>1 <= frequency <= 10<sup>5</sup></code>
- At most, <code>2 *10<sup>5</sup></code>calls will be made to <code>add</code>, <code>deleteOne</code>, and <code>hasFrequency</code>in **total** .
## Solution 1
```python=
class FrequencyTracker:
def __init__(self):
self.num = defaultdict(int) # number, count
self.frequency = defaultdict(list) # freq, number
def add(self, number: int) -> None:
if self.num[number] > 0:
self.frequency[self.num[number]].remove(number)
self.num[number] += 1
self.frequency[self.num[number]].append(number)
else:
self.num[number] += 1
self.frequency[1].append(number)
def deleteOne(self, number: int) -> None:
if self.num[number] > 0:
self.frequency[self.num[number]].remove(number)
self.num[number] -= 1
if self.num[number] >= 1:
self.frequency[self.num[number]].append(number)
def hasFrequency(self, frequency: int) -> bool:
return self.frequency[frequency]
# Your FrequencyTracker object will be instantiated and called as such:
# obj = FrequencyTracker()
# obj.add(number)
# obj.deleteOne(number)
# param_3 = obj.hasFrequency(frequency)
```
>### Complexity
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(n) |
## Note
x