题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
题目描述
在未排序的数组中找到第 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 ≤ 数组的长度。
思路
用multiset实现最小堆;每次比较最小堆的堆顶元素(topK大元素中最小值)与当前元素,如果当前元素更大,替换该元素。
时间复杂度O(nlogk)
代码
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(nums.empty() || k < 1 || k > nums.size())
return -1;
multiset<int, less<int>> m; // 最小堆;保存最大的K个数
multiset<int, less<int>>::iterator it;
for (auto num: nums) {
if(m.size() < k)
m.insert(num);
else{
it = m.begin();
// 如果当前元素比topK的最小元素大,替换该元素
if(*it < num){
m.erase(it);
m.insert(num);
}
}
}
it = m.begin();
return *it;
}
};