1. 程式人生 > 其它 >【Leetcode】895. Maximum Frequency Stack

【Leetcode】895. Maximum Frequency Stack

技術標籤:# 棧、佇列、串及其他資料結構列表資料結構leetcodejava

題目地址:

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),空間取決於具體操作。