提示:priority_queue的底层是堆排序,push和pop的复杂度是O(logN)
第一种:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//时间复杂度O(N*logN)
//空间复杂度O(N)
priority_queue<int> pq;
for(auto& x:nums){
pq.push(x);
}
while(--k){
pq.pop();
}
return pq.top();
}
};
第二种:
sort底层是快排
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//时间复杂度:O(N*log(N))
//空间复杂度:O(1)
sort(nums.begin(),nums.end());
return nums[nums.size()-k];
}
};
第三种:(最优解)堆排序之——topk问题
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//时间复杂度:O(N*log(K))
//空间复杂度:O(1)
priority_queue<int,vector<int>,greater<int>> pq;//小堆
//建立一个k个元素的小堆
for(int i = 0;i<k;i++){
pq.push(nums[i]);
}
//对剩余元素进行遍历,如果比堆顶大就入堆
for(int i = k;i<nums.size();i++){
if(nums[i]>pq.top()){
pq.pop();
pq.push(nums[i]);
}
}
return pq.top();
}
};