今天写到一到数据结构的题目,觉得很有意思,遂记录下leetcode895最大频率栈。
这题既需要记录每个数字的频率,又需要记录每种频率拥有的数字,故采用两个map来实现。
执行过程如下:
class FreqStack {
public:
FreqStack() {
maxFreq=0;
}
void push(int val) {
/*查询是否已存在*/
if(numFreq.find(val)==numFreq.end()){
numFreq[val]=1;
freqNums[1].push(val);
if(maxFreq==0)
maxFreq=1;
}else{
numFreq[val]++;
freqNums[numFreq[val]].push(val);
if(numFreq[val]>maxFreq)
maxFreq++;
}
}
int pop() {
int ans=freqNums[maxFreq].top();
freqNums[maxFreq].pop();
if(freqNums[maxFreq].empty())
maxFreq--;
if(numFreq[ans]==1){
numFreq.erase(ans);
}else{
numFreq[ans]--;
}
return ans;
}
private:
map<int,int>numFreq; //每个数字的频率
map<int,stack<int>>freqNums; //每种频率含有的数字
int maxFreq; //最大频率
};
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack* obj = new FreqStack();
* obj->push(val);
* int param_2 = obj->pop();
*/