45. 数组中的第 k 个最大元素
题目链接
215. 数组中的第 K 个最大元素 - 力扣(LeetCode)
题目描述

题目示例

解法 (快速选择算法)
算法思路
在快速排序的基础上,我们不需要对整个数组进行完全排序。当把数组「分成三块」之后:[ left, l ] [ l + 1, r - 1 ] [ r, right ],我们可以通过计算每一个区间内元素的「个数」,进而推断出我们要找的元素是在「哪一个区间」里面。
那么我们可以直接去「相应的区间」去寻找最终结果就好了,这样能大幅减少比较次数。
C++ 算法代码
class Solution {
public:
int Top_k(vector<int>& nums, int left, int right, int k) {
if(left == right) {
return nums[left];
}
int l = left - 1, r = right + 1, i = left;
// 随机选择基准元素,避免最坏情况
int key = nums[rand() % (right - left + 1) + left];
// 根据基准元素将数组分三块 (荷兰国旗问题变体)
while(i < r) {
if(nums[i] > key) {
swap(nums[i], nums[--r]);
} (nums[i] < key) {
(nums[i++], nums[++l]);
} {
i++;
}
}
(right - r + >= k) {
(nums, r, right, k);
}
(right - l >= k) {
key;
}
{
(nums, left, l, k - (right - l));
}
}
{
(());
(nums, , nums.() - , k);
}
};






