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.
数组中第K大元素:
基本原理:利用快速排序的方法,每次将序列分成两部分,
且两部分元素具有以下性质:一部分的任意元素大于另一部分的一部分任意元素,
即:若两部分元素个数分别为a和b,则最大的a个元素在第一部分中,其余的在另一部分中。
基于上述原理,可以每次都将搜索范围减少,若k<=a,则将搜索范围锁定到第一部分,若k>a,则将搜素范围锁定到第二部分。
直至最后范围中仅有一个元素,即为所求的第K大元素。
平均时间复杂度为O(nlog n)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k, int a = -1, int b = -1) {
int size = nums.size();
if(a == -1 && b == -1){
a = 0, b = size;
}
if((b - a) == 1){
return nums[a];
}
int i = a, j = b-1;
while(i < j) {
while(i < j)
if (nums[i] < nums[j]){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
++i;
break;
}
else{
--j;
}
while(i < j) {
if (nums[i] < nums[j]){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
--j;
break;
}
else{
++i;
}
}
}
if(i >= (k-1)){
return findKthLargest(nums, k, a, i+1);
}
else{
return findKthLargest(nums, k, i+1, b);
}
}
};