Implement FreqStack
, a class which simulates the operation of a stack-like data structure.
FreqStack
has two functions:
push(int x)
, which pushes an integerx
onto the stack.pop()
, which removes and returns the most frequent element in the stack.- If there is a tie for most frequent element, the element closest to the top of the stack is removed and returned.
Example 1:
Input: ["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"], [[],[5],[7],[5],[7],[4],[5],[],[],[],[]] Output: [null,null,null,null,null,null,null,5,7,5,4] Explanation: After making six .push operations, the stack is [5,7,5,7,4,5] from bottom to top. Then: pop() -> returns 5, as 5 is the most frequent. The stack becomes [5,7,5,7,4]. pop() -> returns 7, as 5 and 7 is the most frequent, but 7 is closest to the top. The stack becomes [5,7,5,4]. pop() -> returns 5. The stack becomes [5,7,4]. pop() -> returns 4. The stack becomes [5,7].
Note:
- Calls to
FreqStack.push(int x)
will be such that0 <= x <= 10^9
. - It is guaranteed that
FreqStack.pop()
won't be called if the stack has zero elements. - The total number of
FreqStack.push
calls will not exceed10000
in a single test case. - The total number of
FreqStack.pop
calls will not exceed10000
in a single test case. - The total number of
FreqStack.push
andFreqStack.pop
calls will not exceed150000
across all test cases.
解题思路:
感觉我想的太复杂了,也陷入了思维定式。之前一直纠结于删除后其他元素下标的变化怎么解决,由此搞出了很复杂的算法,时间复杂度都达到了O(n^2) ;
其实呢删除元素后其他元素下标的运算可以不用管,用一个优先级队列存储<频率 , <下标 , 元素值>> , 再用一个哈希表存储<元素值 , 频率> ;
class FreqStack {
public:
FreqStack() {
}
void push(int x)
{
freq[x]++ ;
p.push({freq[x] , {++pos , x}}) ;
}
int pop()
{
int res = p.top().second.second ;
p.pop() ;
freq[res]-- ;
if(freq[res] == 0) freq.erase(res) ;
return res ;
}
private :
unordered_map<int,int> freq ;
priority_queue<pair<int , pair<int , int>>> p ;
int pos = 0 ;
};
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack* obj = new FreqStack();
* obj->push(x);
* int param_2 = obj->pop();
*/