【Leetcode】895. Maximum Frequency Stack

题目地址:

https://leetcode.com/problems/maximum-frequency-stack/

要求设计一个数据结构,能实现下面操作:
1、添加一个数;
2、删除掉出现次数最多的那个数,如果有多个数出现的次数相同,则要删除其中最后添加的那个数。

思路是,用一个哈希表记录每个元素出现了多少次,然后再用一个每个元素都是栈的列表 A A A记录出现次数相同的元素的添加次序。例如, A [ 0 ] A[0] A[0]记录每个至少出现一次的数, A [ 1 ] A[1] A[1]记录每个至少出现两次的数。在push的时候,先查一下哈希表,看一下这个数出现了多少次,如果出现了 i i i次,那么就将其push进 A [ i ] A[i] A[i]的栈中。pop的时候,将 A A A最后一个非空的栈pop即可。注意要时刻维护哈希表存的每个数的出现次数。代码如下:

import java.util.*;

public class FreqStack {
    
    private Map<Integer, Integer> freq;
    private List<Deque<Integer>> list;
    
    public FreqStack() {
        freq = new HashMap<>();
        list = new ArrayList<>();
    }
    
    public void push(int x) {
        freq.put(x, freq.getOrDefault(x, 0) + 1);
        if (list.size() < freq.get(x)) {
            list.add(new ArrayDeque<>());
        }
        
        list.get(freq.get(x) - 1).push(x);
    }
    
    public int pop() {
    	// 把最后一个空栈删掉
        if (!list.isEmpty() && list.get(list.size() - 1).isEmpty()) {
            list.remove(list.size() - 1);
        }
        
        int res = list.get(list.size() - 1).pop();
        freq.put(res, freq.get(res) - 1);
        return res;
    }
}

所有操作时间复杂度 O ( 1 ) O(1) O(1),空间取决于具体操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值