1. 题目描述
2. 解题思路
- 使用堆排序的思想:
- 初始化一个优先级队列(大根堆);
- 遍历数组,使得队列中元素数量始终为
k
个,若元素数目大于k
则弹出栈顶元素; - 最终结果即为优先级队列顶部元素
- 使用快排的思想:
- 只需要将第
k
大的元素放回原位即可; - 对整体数组调用快排,找到
pivot
所在位置,并判断与k-1
的关系:- 若等于
k-1
,即为要找元素,直接返回; - 若大于
k-1
,则要找元素在左侧,递归调用quickSortKthElement(nums, k, left, i - 1)
; - 若小于
k-1
,则要找元素在右侧,递归调用quickSortKthElement(nums, k, i + 1, right)
。
- 若等于
- 只需要将第
3. 代码实现
- 优先级队列
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>> que;
for (auto& num : nums) {
que.emplace(num);
if (que.size() > k) {
que.pop();
}
}
return que.top();
}
};
2.快速排序
class Solution {
private:
int quickSortKthElement(vector<int>& nums, int k, int left, int right) {
int mid = left + (right - left) / 2;
swap(nums[mid], nums[right]);
int partition = nums[right], i = left, j = right;
while (i < j) {
while (i < j && nums[i] >= partition)
i++;
while (j > i && nums[j] <= partition)
j--;
if (i < j)
swap(nums[i], nums[j]);
}
swap(nums[i], nums[right]);
if (i == k - 1)
return nums[i];
if (i < k - 1)
return quickSortKthElement(nums, k, i + 1, right);
return quickSortKthElement(nums, k, left, i - 1);
};
public:
int findKthLargest(vector<int>& nums, int k) {
return quickSortKthElement(nums, k, 0, nums.size() - 1); // 快排整个区间
}
};