package com.anuragkapur.leetcode;
/**
* @author anuragkapur
*/
public class KthLargest {
public int findKthLargest(int[] nums, int k) {
return findKthLargest(nums, nums.length-k, 0, nums.length-1);
}
private int findKthLargest(int[] nums, int indexOfK, int start, int end) {
if (start == end) {
if (indexOfK == start) {
return nums[start];
} else {
// this should never happen, throw custom exception
return -1;
}
}
int pivot = partition(nums, start, end);
if (pivot == indexOfK) {
return nums[pivot];
}
if (pivot < indexOfK) {
return findKthLargest(nums, indexOfK, pivot+1, end);
} else {
return findKthLargest(nums, indexOfK, start, pivot-1);
}
}
/**
*
* @param a
* @param start
* @param end
* @return index of element in array <code>a</code> that is in its final position in the sorted version of array
* <code>a</code>
*/
private int partition(int a[], int start, int end) {
int trailer = start-1;
int leader = start;
while(leader < end) {
if (a[leader] > a[end]) {
leader ++;
} else {
trailer ++;
swap(a, trailer, leader);
leader ++;
}
}
trailer ++;
swap(a, trailer, end);
return trailer;
}
private void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}