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) {
arrangeRight(nums,0,nums.size()-1,k);//将前k个大数放在nums右边,O(n).
quickSort(nums,nums.size()-k,nums.size()-1); //对前k个数快排。O(klogk).
return nums[nums.size()-k];
}
void arrangeRight(vector<int>& nums, int start, int end, int k){
if(start >= end)
return;
int key = nums[start];
int i = start, j = end;
while(i!=j){
while(j>i && nums[j] >= key)
--j;
swap(nums,i,j);
while( i<j && nums[i] <= key)
++i;
swap(nums,i,j);
}//a[i] = key
if(k == (nums.size() - i)) return;
if(k < (nums.size() - i)) arrangeRight(nums,i+1,end,k);
if(k > (nums.size() - i)) arrangeRight(nums,start,i-1,k-(nums.size()-i));
}
void quickSort(vector<int>& nums, int start, int end){
if(start >= end)
return;
int key = nums[start];
int i = start, j = end;
while(i!=j){
while(j>i && nums[j] >= key)
--j;
swap(nums,i,j);
while( i<j && nums[i] <= key)
++i;
swap(nums,i,j);
}
quickSort(nums,start,i-1);
quickSort(nums,i+1,end);
}
void swap(vector<int> &v,int a,int b){
int t = v[a];
v[a] = v[b];
v[b] = t;
}
};
Solution explained: 点击打开链接