[動畫leetcode高頻面試之數組系列之棧隊列]2 數據流中的第K大元素

這是我的面試經歷以及整理的相關面試高頻題目,希望對大家有幫助。面試集錦

老規矩,不白嫖,點贊再看!

思考?

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 關注我和專欄,讓我們成爲好基友。

發佈了34 篇原創文章 · 獲贊 65 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章