【LeetCode】703. Kth Largest Element in a Stream (C++)
阿新 • • 發佈:2018-12-19
描述:
Design a class to find the k
th largest element in a stream. Note that it is the k
th largest element in the sorted order, not the k
th distinct element.
Your KthLargest
class will have a constructor which accepts an integer k
and an integer array nums
, which contains initial elements from the stream. For each call to the method KthLargest.add
Example:
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
Note:
You may assume that nums’ length ≥ k-1
and k
≥ 1.
理解:
返回輸入的流中第k
大的數
思路:
自己想到的是用vector<int> maxK
做,初始化的時候對輸入的陣列排序,並把前k
大的存起來,然後再加入的時候如果在前k
個裡就更新前k
大陣列,否則就不更新,每次返回maxK.back()
。程式碼如下
class KthLargest { vector<int> maxK; public: KthLargest(int k, vector<int> nums):maxK(k) { sort(nums.begin(), nums.end(), [](int a, int b) {return a > b; }); for (int i = 0; i < k; ++i) { maxK[i] = nums[i]; } } int add(int val) { if (val > maxK.back()) { int i; for (i = maxK.size() - 1; i >= 0 && maxK[i] < val; --i) { maxK[i] = i - 1 >= 0 ? maxK[i - 1] : val; } maxK[i+1] = val; } return maxK.back(); } }; /** * Your KthLargest object will be instantiated and called as such: * KthLargest obj = new KthLargest(k, nums); * int param_1 = obj.add(val); */
這樣在nums.size()>=k
的時候應該沒有問題,但是如果初始nums.size()<k
就會出錯。懶得再去判斷這種情況了。參考了別人的解法,使用了C++的priority_queue
.
解法:
priority_queue
允許為佇列中的元素建立優先順序。新加入的元素會排在所有優先順序比它低的已有元素之前。預設基於vector
實現。- 底層採用堆實現。隊首元素為優先順序最高的元素。
預設優先順序是從大到小。使用
top()
獲取優先順序最高的元素。push()
和pop()
分別新增和刪除。刪除的為優先順序最高的元素。
priority_queue<int> pq;
也可自定義優先順序
priority_queue<int, vector<int>, less<int> > pq;
//其中,第二個引數( vector ),是來承載底層資料結構堆的容器;
//第三個引數( less ),則是一個比較類,less 表示數字大的優先順序高,而 greater 表示數字小的優先順序高。
//也就是說,less還是表示從大到小,greater則表示從小到大
具體實現如下:
class KthLargest {
priority_queue<int, vector<int>, greater<int> > pq;
int k;
public:
KthLargest(int k, vector<int> nums):k(k) {
for (auto n : nums) {
pq.push(n);
if (pq.size() > k)
pq.pop();
}
}
int add(int val) {
pq.push(val);
if (pq.size() > k)
pq.pop();
return pq.top();
}
};
去和本科室友吃飯。