leetcode 703. 數據流中的第K大元素 小頂堆

建立一個大小爲k的最小堆,堆頂就是第k大的元素
數據流中如果有比k大的元素,入堆,重新調整,保持一共k個元素
如果比k小直接返回堆頂即可

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

#define debug(x) cout<<#x<<": "<<x<<endl;

class KthLargest {
public:
    vector<int> numss;
    int kk;
    KthLargest(int k, vector<int>& nums) {
        kk = k;
        numss = nums;
        make_heap(numss.begin(),numss.end(),greater<int>()  );
        while( numss.size()>kk ){
            pop_heap(numss.begin(),numss.end(),greater<int>()  );
            numss.pop_back();
        }
    }

    int add(int val) {
        if( numss.size() < kk ){
            numss.push_back( val );
            make_heap(numss.begin(),numss.end(),greater<int>()  );
            return numss[0];
        }else if( val <= numss[0] ){
            return numss[0];
        }else{
            numss.push_back( val );
            pop_heap(numss.begin(),numss.end(),greater<int>()  );
            numss.pop_back();
            return numss[0];
        }
        return 0;
    }
};


int main()
{
    int k = 3;
    vector<int> arr = {4,5,8,2};
    KthLargest kthLargest(k,arr);

    debug( kthLargest.add(3) ); // returns 4
    debug( kthLargest.add(5) );// returns 5
    debug( kthLargest.add(10) );// returns 5
    debug( kthLargest.add(9) );// returns 8
    debug( kthLargest.add(4) );// returns 8

    return 0;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章