1. 程式人生 > >【LeetCode】703. Kth Largest Element in a Stream (C++)

【LeetCode】703. Kth Largest Element in a Stream (C++)

描述:

Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth 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

, return the element representing the kth largest element in the stream.

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();
	}
};

去和本科室友吃飯。