
class Solution {
public int findKthLargest(int[] nums, int k) {
return randomSelect(nums,nums.length-k);
}
public static int randomSelect(int[] nums,int i){
int ans = 0;
int l = 0;
int r = nums.length-1;
while(l<=r){
partition(nums,l,r,nums[l + (int)(Math.random()*(r-l+1))]);
if(i < first){
r = first - 1;
}else if(i > last){
l = last + 1;
}else{
ans = nums[i];
break;
}
}
return ans;
}
public static int first,last;
public static void partition(int[] nums,int l,int r,int x){
int i = l;
first = l;
last = r;
while(i<=last){
if(nums[i]<x){
swap(nums,i,first);
first ++;
i++;
}else if(nums[i]>x){
swap(nums,i,last);
last--;
}else{
i++;
}
}
}
public static void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}