【Leetcode】895. Maximum Frequency Stack
阿新 • • 發佈:2021-01-15
技術標籤:# 棧、佇列、串及其他資料結構列表資料結構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),空間取決於具體操作。