在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
思路
方法一:
通过排序,然后返回第K个元素,O(nlogn)
方法二:
- 维护一个K大小的最小堆:堆中元素个数小于K时,直接入堆;堆中元素个数大于K时,判断是否大于堆顶,大于则入堆,且将堆顶元素弹出。
- 因为大于堆顶的元素都入堆,且堆大小为K,当遍历完数组之后,就能保证最大的K个元素都在堆中
- 又因为是最小堆,所以第K大的元素在堆顶
维护一个大小为K的最小堆,O(logK),遍历数组,O(n),总O(nlogk),适用于当n远大于K的场景。
std堆的构造:
priority_queue<Type, Container, Functional>
Type为数据类型, Container为保存数据的容器,Functional为元素比较方式
*/
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>> q;
for(int i=0;i<nums.size();i++){
if(i<k){
q.push(nums[i]);
}
else if(q.top()<nums[i]){
q.pop();
q.push(nums[i]);
}
}
return q.top();
}
};