1. 初識PriorityQueue
PriorityQueue 是隊列,隊列就是先進先出, 但PriorityQueue 能做到按優先級出隊列。
PriorityQueue 實現Queue接口,但如何做到按優先級出隊列?
在數據結構上,採用堆,在數據存儲上採用的是數組;
通過在入隊時,就把數據排序好;排序就是用戶自定義優先級。
在出隊時,通過堆這種結構,出隊堆頂元素,並重新維護好堆的數據結構。
2. 應用場景:Top K 元素
- 小頂堆:求k個最大數
構建的是指定容量的小頂堆,因此每次queue.peek()返回的是最小的數字,在遍歷數組的過程中,如果遇到比該數字大的元素就將最小的數字poll(移除掉),然後將較大的元素添加到堆中,在添加進去堆中的時候,堆同時會按照優先級比較,將最小的元素再次放到堆頂,這樣的做法就是會一直保持堆中的元素是相對較大的,同時堆頂元素是堆中最小的。 - 大頂堆:求k個最小數
直接構建一個大頂堆,這樣元素最大的值在堆頂,每次去和數組的元素的值去做比較,只要堆頂元素比數組的值小,就將堆頂元素poll出來,然後將數組的值添加進去,這樣就可以一直保持集合數組中一直是最小的k個數字。
3. 應用場景:TopK 高頻元素
- 先計算數組中數字出現的頻率,然後維護一個哈希表用來存儲元素的頻率;
- 然後構建優先級隊列,這裏依舊是構建小頂堆,不過因爲該題是計算元素出現的頻率,因此我們需要將每個元素的頻率值做對比