letcode::数组中的第k个最大元素
数组中的第k个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
思路:
- sort排序
从大到小排序后,返回第k-1个元素。 - 优先队列
大堆的时间复杂度是 k ∗ l o g 2 N k * log_2N k∗log2N
小堆的时间复杂度是 ( N − K ) ∗ l o g 2 K (N-K)*log_2K (N−K)∗log2K
当k不大时,还是与O(N)接近的。
代码:
sort排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), greater<int>());
return nums[k - 1];
}
};
大堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//大堆 k * logN
priority_queue<int> pq(nums.begin(), nums.end());
while (--k)
{
pq.pop();
}
return pq.top();
}
};
小堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//小堆 (N- K)* logN
priority_queue<int, vector<int>, greater<int>> pq(nums.begin(), nums.begin() + k);
for (int i = k; i < nums.size(); ++i)
{
if (nums[i] > pq.top())
{
pq.pop();
pq.push(nums[i]);
}
}
return pq.top();
}
};