算法实战:数组中第 K 个最大元素与最小的 K 个数
45. 数组中的第 K 个最大元素
题目链接
题目描述
给定整数数组 nums 和整数 k,请返回该数组中第 k 个最大的元素。
题目示例

解法:快速选择算法
核心思路
快速选择(Quick Select)是快速排序的变种。在快排中,我们将数组划分为三个区域:小于基准、等于基准、大于基准。通过计算每个区域的元素数量,我们可以直接判断目标值落在哪个区间,从而避免对无关部分进行递归排序。
对于寻找第 k 大的元素,我们关注的是右侧的大数区域。如果右侧区域元素数量大于等于 k,说明目标就在右边;否则,我们需要调整 k 的值继续在左侧或中间查找。
C++ 代码实现
class Solution {
public:
int Top_k(vector<int>& nums, int left, int right, int k) {
if (left == right) {
return nums[left];
}
// 随机选择基准元素,避免最坏情况
int key = nums[rand() % (right - left + 1) + left];
int l = left - 1, r = right + 1, i = left;
// 三路划分:大于 key 的放右边,小于 key 的放左边
while (i < r) {
if (nums[i] > key) {
swap(nums[i], nums[--r]);
} else (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);
}
};





