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:
//方法一:建立一个堆维护k个最大的数,没有必要,因为只需要第k大,而不需要前k大的数
//方法二:partition and findKthLargest.//利用快排的思想
int findKthLargest(vector<int>& nums, int k) {
//if(k<1||k>nums.size()) return 0;
int begin = 0, end = nums.size()-1;
while(true){
int index = partition(nums,begin,end);
if(index==nums.size()-k) return nums[index];
else if(index<nums.size()-k) begin = index+1;
else end = index-1;
}
}
int partition(vector<int>& nums,int begin,int end){
// if(!nums.size() || begin<0 || end<0 || end>nums.size()-1)
// throw("Invalid Parameters");
if(end==begin) return begin;
int idx = rand()%(end-begin)+begin;
swap(&nums[idx], &nums[end]);
int small = begin-1;
for(idx = begin; idx<end; ++idx){
if(nums[idx]<nums[end]){
small++;
if(small!=idx) swap(&nums[idx],&nums[small]);
}
}
++small;
swap(&nums[small],&nums[end]);
return small;
}
void swap(int*x,int*y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
};