Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (nums.empty()) return -1;
srand(time(NULL));
return select(nums, 0, nums.size() - 1, k);
}
private:
int select(vector<int>& nums, int l, int r, int k) {
if (l == r) return nums[l];
int p = partition(nums, l, r);
// 从大到小排序,第k大元素对应数组下标为k-1的元素
if ((k - 1) == p) {
return nums[p];
}
else if ((k - 1) > p) {
return select(nums, p+1, r, k);
}
else {
return select(nums, l, p - 1, k);
}
}
int partition(vector<int>& nums, int l, int r) {
swap(nums[l], nums[rand() % (r - l + 1) + l]);
int base = nums[l];
// 从大到小排序的partition操作
//[l+1...j] > base; [j+1...i) < base;
int j = l;
for (int i = l + 1; i <= r; i++) {
if (nums[i] > base) {
j++;
swap(nums[j], nums[i]);
}
}
swap(nums[l], nums[j]);
return j;
}
};