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.
public class Solution {
public int findKthLargest(int[] nums, int k) {
return findKthLargestHelper(nums, k, 0, nums.length - 1);
}
private int findKthLargestHelper(int[] nums, int k, int begin, int end){
if(begin == end && k == 1)
return nums[begin];
int endPoint = begin+1;
int searchEnd = begin+1;
int pivot = nums[begin];
while(searchEnd <= end){
if(nums[searchEnd] > pivot){
swap(nums, searchEnd, endPoint);
searchEnd++;
endPoint++;
}
else{
searchEnd++;
}
}
endPoint--;
swap(nums,endPoint, begin);
if(endPoint - begin + 1 == k)
return pivot;
else if(endPoint - begin + 1 < k){
return findKthLargestHelper(nums, k - (endPoint - begin + 1), endPoint+1, end);
}
else{
return findKthLargestHelper(nums, k, begin, endPoint - 1);
}
}
private void swap(int[] nums, int index1, int index2){
if(index1 == index2)
return;
int tmp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = tmp;
}
}