【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),空间取决于具体操作。

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/112605947