来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
题目描述:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
输入:
[3,2,1,5,6,4] 和 k = 2
输出:
5
解题思路(此解法相对比较优化):
- 利用priority_queue建立堆
- priority_queue默认为建立大堆
- 通过出堆,即可找出数据
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//方法一:先排序,升序,再从往前找
//时间复杂度:O(N*logN)
// sort(nums.begin(),nums.end());
// return nums[nums.size()-k];
//方法二:先排序,利用模板参数,直接降序排序,再从前往后找
//时间复杂度:O(N*logN)
//sort(nums.begin(),nums.end(),greater<int>());
//return nums[k-1];
//方法三:先放数据在priority_queue中,再删除前k-1个数
//时间复杂度:O(N+K*logK)
//若N远远大于K,这这方法更适用
//priority_queue<int> p(nums.begin(),nums.end())
//for(int i = 0; i < k-1; i++)
//{
// p.pop();
//}
//return p.top();
//方法四:
//构建k个数的小堆,最优化
//时间复杂度:O(K+(N-K)*logK)
priority_queue<int,vector<int>,greater<int>> KMinHeap(nums.begin(),nums.begin()+k);
for(size_t i = k; i < nums.size(); ++i)
{
if(nums[i] > KMinHeap.top())
{
KMinHeap.pop();
KMinHeap.push(nums[i]);
}
}
return KMinHeap.top();
}
};