每日一题
215. 数组中的第K个最大元素
给定整数数组 `nums` 和整数 `k`,请返回数组中第 `**k**` 个最大的元素。
请注意,你需要找的是数组排序后的第 `k` 个最大的元素,而不是第 `k` 个不同的元素。
你必须设计并实现时间复杂度为 `O(n)` 的算法解决此问题。
**示例 1:**
```
输入: [3,2,1,5,6,4], k = 2
输出: 5
解法一:快速选择
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int quickselect(vector<int> &nums, int l, int r, int k) {
if (l == r) return nums[l];
int left = l - 1, right = r + 1;
int key = nums[rand() % (r - l + 1) + l];
for(int i = l; i < right;)
{
if(key < nums[i]) swap(nums[i], nums[--right]);
else if(key > nums[i]) swap(nums[i++], nums[++left]);
else i++;
}
int c = r - right + 1, b = right - left - 1;
if(k <= c) return quickselect(nums, right, r, k);
else if(k <= c + b) return key;
else return quickselect(nums, l, left, k - c - b);
}
int findKthLargest(vector<int> &nums, int k) {
srand(time(NULL));
return quickselect(nums, 0, nums.size() - 1, k);
}
};