[LeetCode215] 数组中的第k个最大元素
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
discription:
在未排序的数组中找到第 k 个最大的元素。
solution:
用随机化快排partition, 由于每次查询区间减半, 等比递缩和是2, 时间复杂度\(O(n)\)
注意讨论右区间时, 原问题就变成了右区间中第\((k-i+l-1)\)大的数.
code:
class Solution {
public:
inline void swap(int& a, int& b) {
int tmp = a;
a = b, b = tmp;
}
inline int find(vector<int>& nums, const int& l, const int& r, const int &k) {
srand((unsigned)time(0));
int p = l + rand() % (r - l + 1);
swap(nums[l], nums[p]);
if (l == r)return nums[l];
int i = l;
for (int j = l + 1; j <= r; ++j)
if (nums[j] > nums[l]) swap(nums[++i], nums[j]);
swap(nums[i], nums[l]);
if (k == i - l + 1)return nums[i];
if (k < i - l + 1)return find(nums, l, i - 1, k);
else return find(nums, i + 1, r, k - i + l - 1);
}
int findKthLargest(vector<int>& nums, int k) {
int size = nums.size() - 1;
return find(nums, 0, size, k);
}
};