数组中的第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 * logNpriority_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)* logNpriority_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();}
};