题目简述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
输入:[3,2,1,5,6,4] 和 k = 2 输出:5
输入:[3,2,3,1,2,4,5,5,6] 和 k = 4 输出:4
思路一:利用STL大根堆维护数组元素,将前k-1个元素从大根堆中弹出,栈顶元素就是K大值
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int> q;
for(auto x : nums) q.push(x);
while(--k) q.pop();
return q.top();
}
};
class Solution {
public:
int select(vector<int>& nums, int l, int r, int k)
{
if(l == r) return nums[l];//递归出口
int x = nums[l+r >> 1];//分界点,分为左右区间
int i = l - 1, j = r + 1;//指针起始位置
while(i < j)//从大到小排序
{
//找到 左区间中比分界点小的数 和 右区间中比分界点大的数 交换
while(nums[++i] > x);
while(nums[--j] < x);
if(i < j) swap(nums[i], nums[j]);
}
int s = j - l + 1;//计算左区间个数
if(k > s) return select(nums,j+1,r,k-s);//递归右区间
return select(nums,l,j,k);//递归左区间
}
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
return select(nums, 0, n - 1, k);
}
};