目录
一.题目原型
二.思路解析:
三.具体代码实现:
一.题目原型
二.思路解析:
其实我们可以用两个哈希表来解决这道题,一个哈希表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;
};