leetcode 895. Maximum Frequency Stack

4 篇文章 0 订阅

Implement FreqStack, a class which simulates the operation of a stack-like data structure.

FreqStack has two functions:

  • push(int x), which pushes an integer x 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 that 0 <= 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 exceed 10000 in a single test case.
  • The total number of FreqStack.pop calls will not exceed 10000 in a single test case.
  • The total number of FreqStack.push and FreqStack.pop calls will not exceed 150000 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();
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值