给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param k int整型
* @return int整型
*/
// nums数组有序后,第 i 个数的位置
int randSelect(vector<int>&nums, int i){
int ans = 0;
for(int l = 0, r = nums.size() - 1;l <= r;){
int lt = l, gt = r, x = nums[l + rand() % (r - l + 1)];
for(int j = l;j <= gt;){
if(nums[j] < x){
swap(nums[j++], nums[lt++]);
}else if(nums[j] == x){
j++;
}else{
swap(nums[j], nums[gt--]);
}
}
if(i < lt){
r = lt - 1;
}else if(i > gt){
l = gt + 1;
}else{
ans = nums[i];
break;
}
}
return ans;
}
int findKthLargest(vector<int>& nums, int k) {
// write code here
return randSelect(nums, nums.size() - k);
}
};