class Solution {
public int findKthLargest(int[] nums, int k) {
return quickSelect(nums, k, 0, nums.length-1);
}
private int quickSelect(int[] nums, int k, int start, int end) {
int pi = partition(nums, start, end);
// ๆฏๅจๅฝๅ่ๅดๆพ
int cnt = pi+1 - start;
if (cnt == k) {
return nums[pi];
}
if (cnt < k) {
//ๆณจๆk-cntไปฅๅpi+1
return quickSelect(nums, k-cnt, pi+1, end);
} else {
return quickSelect(nums, k, start, pi-1);
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
private int partition(int[] nums, int start, int end) {
int pi = start - 1;
int pivot = nums[end];
for (int i = start; i <= end; i++) {
// ๆณจๆๆฏ้ๅบ๏ผๆไปฅ่ฟ้ๆฏๅคงไบ
if (nums[i] >= pivot) {
swap(nums, i, ++pi);
}
}
return pi;
}
}