在未排序的数组中找到第 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 ≤ 数组的长度。
方法一:排序后求解
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
return nums[nums.size()-k];
}
};
方法二:利用快排的思想
class Solution {
public:
int partition(vector<int> &nums,int left,int right){
int val = nums[right];
for(int i=left;i<right;i++){
if(nums[i]<val)
swap(nums[left++],nums[i]);
}
swap(nums[right],nums[left]);
return left;
}
int findKthLargest(vector<int>& nums, int k) {
int ans,left=0,right=nums.size()-1,pos=nums.size()-k;
while((ans=partition(nums,left,right))!=pos){
ans<pos?left=ans+1:right=ans-1;
}
return nums[pos];
}
};
方法三:最大堆,每次去除最大的元素,然后维护堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
make_heap(nums.begin(),nums.end(),less<int>());
int ans = 0;
for(int i=0;i<k;i++){
ans = nums.front();
pop_heap(nums.begin(),nums.end());
nums.pop_back();
}
return ans;
}
};
方法四:优先队列,每次去除队首元素,默认是按照优先级降序排列
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>> q; //显示说明内部是vector类型,也可以不加vector<int>
for(auto num:nums){
q.push(num);
}
int temp = 0;
for(int i=0;i<k;i++){
temp = q.top();
q.pop();
}
return temp;
}
};