目录
一.题目原型
二.思路解析:
三.具体代码实现:
一.题目原型
二.思路解析:
其实我们可以用两个哈希表来解决这道题,一个哈希表hash1用来存这个数字出现了几次。另一个哈希表hash2用来存出现了几次的次数有几次,由于题目给的number和frequency都不是很大,我们可以用数组模拟unordered_map.
vector<int> freq;(记录数字出现的次数)
vector<int> freq_cnt;(记录次数的次数)
如果一个数字出现了,那么原来次数的次数就要少一次,原来次数+1的次数就要多一次,freq_cnt[freq[i]]--
接着freq【i】++
刚好使这个数字的次数加一,那么可以直接freq_cnt[freq[i]]++;
如果一个数字要删除,那么原来的次数的次数要少一次,原来次数-1的次数就要多一次;
freq_cnt[freq[i]]--
freq[i]-- ;
freq_cnt[freq[i]]++
三.具体代码实现:
class FrequencyTracker {
public:
FrequencyTracker():freq(N), freq_cnt(N) {
}
void add(int number) {
--freq_cnt[freq[number]];
++freq[number];
++freq_cnt[freq[number]];
}
void deleteOne(int number) {
if (freq[number] == 0) {
return;
}
--freq_cnt[freq[number]];
--freq[number];
++freq_cnt[freq[number]];
}
bool hasFrequency(int frequency) {
return freq_cnt[frequency];
}
private:
static const int N = 100001;
vector<int> freq;
vector<int> freq_cnt;
};