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.
这题用 O(nlogn) 是可以过的,也就是说你可以先排序再找,也可以用 heap,priority_queu 等数据结构。
当然,用 Quicksort 里的 Quick-select(也就是 partion)方法是可以做到 O(n) 的。(对于为啥 quick select 是 O(n) 的可以看
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size() - k - 1];
}
};
class Solution {
private:
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[left];
int l = left + 1, r = right;
while (l <= r) {
if (nums[l] < pivot && nums[r] > pivot){
swap(nums[l++], nums[r--]);
}
if (nums[l] >= pivot) l++;
if (nums[r] <= pivot) r--;
}
swap(nums[left], nums[r]);
return r;
}
public:
int findKthLargest_qsort(vector<int>& nums, int k) {
int left = 0, right = nums.size() - 1;
while (true) {
int pos = partition(nums, left, right);
if (pos == k - 1){
return nums[pos];
}
if (pos > k - 1) {
right = pos - 1;
}else{
left = pos + 1;
}
}
}
};