方法一:使用第一个位置的一趟快速排序
class Solution {
public int findKthLargest(int[] nums, int k) {
return Partion(nums,k-1,0,nums.length-1);
}
int Partion(int nums[],int k,int start,int end){
int q=start;
for(int i=start+1;i<=end;i++)
if(nums[i]>nums[start])
Swap(nums,i,++q);
Swap(nums,q,start);
if(q==k)
return nums[q];
else if(q<k){
return Partion(nums,k,q+1,end);
}
else
return Partion(nums,k,start,q-1);
}
void Swap(int nums[],int i,int j){
if(i!=j){
nums[i]^=nums[j];
nums[j]^=nums[i];
nums[i]^=nums[j];
}
}
}
方法二:使用随机数的一趟快速排序
class Solution {
public int findKthLargest(int[] nums, int k) {
return kth(nums,0,nums.length-1,k);
}
int kth(int nums[],int start,int end,int k){
Random rand=new Random();
int pos=rand.nextInt(end-start+1)+start;
swap(nums,pos,start);
pos=start;
for(int i=start+1;i<=end;i++)
if(nums[i]>nums[start] )
swap(nums,i,++pos);
int gap=pos-start+1;
if(gap==k)
return nums[start];
else if(gap<k)
return kth(nums,pos+1,end,k-gap);
else
return kth(nums,start+1,pos,k);
}
void swap(int nums[],int i,int j){
if(i!=j){
nums[i]^=nums[j];
nums[j]^=nums[i];
nums[i]^=nums[j];
}
}
}