這是我的面試經歷以及整理的相關面試高頻題目,希望對大家有幫助。面試集錦
老規矩,不白嫖,點贊再看!
思考?
1 什麼是優先隊列?
2 什麼是最小堆或最大堆?
在此大家可以先思考1分鐘
順便複習下
隊列
再看題解效果會更好哈
- 優先級隊列
在之前的學習中,我們知道隊列有着先進先出的特點。那麼優先級隊列是什麼呢?主要體現在修飾詞"優先級"三字上面。比如在一組數中,我們規定最大值先出或者最小值先出,並按照這個約束依次出隊。那麼從生活中例子來看,比如火車站窗口通常都有軍人優先的類似字樣,因爲這些特性讓其有了特殊權利,他們就可以先買票。
- 小頂堆及基本實現機制
小頂堆是如下圖樹的形式(樹和圖等後續再詳細介紹)。節點值越小的越在前面,自然堆頂(10)就是最小的元素。其實現機制主要採用二叉堆,二叉搜索樹,斐波那契堆等。
一 題目
設計一個找到數據流中第K大元素的類(class)。注意是排序後的第K大元素,不是第K個不同的元素。
你的 KthLargest 類需要一個同時接收整數 k 和整數數組nums 的構造器,它包含數據流中的初始元素。每次調用 KthLargest.add,返回當前數據流中第K大的元素。
示例
示例:
int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3); // returns 4
kthLargest.add(5); // returns 5
kthLargest.add(10); // returns 5
kthLargest.add(9); // returns 8
kthLargest.add(4); // returns 8
說明:
你可以假設 nums 的長度≥ k-1 且k ≥ 1。
1 leetcode連接
2 題目解析
- 保存前k個最大的值,每次進來一個元素A,如果元素A比這k個元素中的最小值還要小就踢出去。那麼我們如何保存這k個數呢?
每進來一個數,和其中k個數進行排序,假設使用快速排序,其整體的時間複雜度爲O(nklogk).
採用優先級隊列。維護一個k個元素的小頂堆,優先級從小到大排列,最上面爲最小的元素,每次元素過來,就有兩種情況。第一種情況小於堆頂,那麼就直接淘汰。第二種情況,比堆頂元素大,那麼淘汰堆頂,更新堆結構,因爲每次從堆中取出元素,爲O(1),每調整一次堆爲O(log2k)。所以整體複雜度爲O(n*log2k)。咱們動畫理解下這個過程。
3 動畫演示
調整小頂堆
4 代碼實現
- c++版本
- python版本
- java版本
5 收尾
系列算法題均採用三種不同的語言實現,滿足不同小夥伴的需求。如有不對的地方希望小夥伴指出,感謝!
❤️ 看完三件事:如果您看完有一點點收穫,快速迎娶白富美方式:
1 關注公衆號「我是程序員小賤」,第一時間閱讀最新的文章,公衆號後臺回覆 [小天使] 送你 最新的編程技術資料。
2 點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
3 關注我和專欄,讓我們成爲好基友。