class Solution {
Random random = new Random();
public int findKthLargest(int[] nums, int k) {
return quickSelect(nums, 0, nums.length-1, nums.length-k);
}
//给出nums里从小到大排在index位置的数
int quickSelect(int[] nums, int l,int r, int index){
int p=randomPartition(nums, l, r);
if (p==index){
return nums[index];
}
else if(p<index){
return quickSelect(nums,p+1,r,index);
}
else if(p>index){
return quickSelect(nums,l,p-1,index);
}
return -1;
}
//随机把nums中的一个数放到最右边作为pivot
int randomPartition(int nums[],int l, int r){
int pivotIndex=random.nextInt(r-l+1)+l; //随机产生一个pivotIndex
swap(nums,pivotIndex,r); //把pivot放到最右边
return partition(nums,l,r); //partition方法默认把最右边的那个当作pivot 所以不需要传pivot
}
//nums里最右边的数作为pivot 分一次
int partition(int[] nums, int l, int r){
int i=l;
int j;
for(j=l;j<r;j++){
if(nums[j]<=nums[r]){
swap(nums,i,j);
i++;
}
}
swap(nums,i,r);
return i;
}
void swap(int[] nums, int i, int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}