共用三个成员来进行维护:
维护每个数出现的次数 numsCnt;
维护每一种次数包含哪一些数 timesToNum,并且越晚入栈的数越靠后;注意:假设一个数出现次数为5,这个数一样会出现在 timesToNum[4,3,2,1] 的 list 中.... (但仔细一算,空间复杂度还是 O(n))
维护最大次数的值 maxx;
详看代码:
class FreqStack { public: FreqStack() { } void push(int val) { ++ numsCnt[val]; timesToNum[numsCnt[val]].push_back(val); maxx = max(maxx, numsCnt[val]); } int pop() { int ret = timesToNum[maxx].back(); timesToNum[maxx].pop_back(); -- numsCnt[ret]; if(timesToNum[maxx].empty()) { -- maxx; } return ret; } private: unordered_map<int, int> numsCnt; // 数出现的次数 unordered_map<int, list<int>> timesToNum; // 次数对应的数 int maxx = 0; };