隊列--數(shù)據(jù)流中第k個大的值 leetcode 703

題目

設(shè)計一個找到數(shù)據(jù)流中第K大元素的類(class)椎咧。注意是排序后的第K大元素朋其,不是第K個不同的元素膝舅。
你的 KthLargest 類需要一個同時接收整數(shù) k 和整數(shù)數(shù)組nums 的構(gòu)造器姨伟,它包含數(shù)據(jù)流中的初始元素谊迄。每次調(diào)用 KthLargest.add闷供,返回當(dāng)前數(shù)據(jù)流中第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

說明:
你可以假設(shè) nums 的長度≥ k-1 且k ≥ 1鳞上。

思路

求第k個大的值这吻,可以考慮維護(hù)一個大小為k的小頂堆,這里可以使用優(yōu)先隊列的數(shù)據(jù)結(jié)構(gòu)篙议,小頂堆中存放的頂點(diǎn)永遠(yuǎn)是第k個大的元素
時間復(fù)雜度:O(Nlogk)唾糯,因?yàn)槊總€元素都要進(jìn)行堆排序,堆排序的算法中優(yōu)先隊列插入的時間負(fù)責(zé)度為logk
空間復(fù)雜度:O(k)

c++代碼
class KthLargest {
private:
    priority_queue<int,vector<int>,greater<int>> data_stream;
    int number;

public:
    KthLargest(int k, vector<int>& nums) {
        number = k;
        for(int n: nums){
            if(data_stream.size()<number) data_stream.push(n);
            else{
                if(data_stream.top() < n){
                    data_stream.pop();
                    data_stream.push(n);
                }
            }
        }
    }
    
    int add(int val) {
        if(data_stream.size()<number) data_stream.push(val);
        else{
            if(data_stream.top() < val){
                data_stream.pop();
                data_stream.push(val);
            }
        }
        
        return data_stream.top();
    }
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest* obj = new KthLargest(k, nums);
 * int param_1 = obj->add(val);
 */
python代碼
class KthLargest:

    def __init__(self, k: int, nums: List[int]):
        self.data_stream = nums
        self.k = k

    def add(self, val: int) -> int:
        self.data_stream.append(val)
        return heapq.nlargest(self.k, self.data_stream)[-1]
        


# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鬼贱,一起剝皮案震驚了整個濱河市移怯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌这难,老刑警劉巖舟误,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姻乓,居然都是意外死亡嵌溢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蹋岩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赖草,“玉大人,你說我怎么就攤上這事剪个⊙砥铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵扣囊,是天一觀的道長乎折。 經(jīng)常有香客問我,道長侵歇,這世上最難降的妖魔是什么骂澄? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮惕虑,結(jié)果婚禮上坟冲,老公的妹妹穿的比我還像新娘士修。我一直安慰自己,他們只是感情好樱衷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酒唉,像睡著了一般矩桂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痪伦,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天侄榴,我揣著相機(jī)與錄音,去河邊找鬼网沾。 笑死癞蚕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辉哥。 我是一名探鬼主播桦山,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼醋旦!你這毒婦竟也來了恒水?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤饲齐,失蹤者是張志新(化名)和其女友劉穎钉凌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捂人,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡御雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滥搭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酸纲。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖论熙,靈堂內(nèi)的尸體忽然破棺而出福青,到底是詐尸還是另有隱情,我是刑警寧澤脓诡,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布无午,位于F島的核電站,受9級特大地震影響祝谚,放射性物質(zhì)發(fā)生泄漏宪迟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一交惯、第九天 我趴在偏房一處隱蔽的房頂上張望次泽。 院中可真熱鬧穿仪,春花似錦、人聲如沸意荤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玖像。三九已至紫谷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捐寥,已是汗流浹背笤昨。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留握恳,地道東北人瞒窒。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像乡洼,于是被迫代替她去往敵國和親崇裁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353