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.
public class Solution {
public int findKthLargest(int[] nums, int k) {
if (k < 1 || k > nums.length) {
return 0;
}
int[] kHeap = new int[k];
for (int i = 0; i < k; i++) {
heapInsert(kHeap, nums[i], i);
}
for (int i = k; i < nums.length; i++) {
if (nums[i] > kHeap[0]) {
kHeap[0] = nums[i];
heapify(kHeap, 0, k);
}
}
return kHeap[0];
}
private void heapify(int[] kHeap, int index, int heapSize) {
// TODO Auto-generated method stub
int left = index * 2 + 1;
int right = index * 2 + 2;
int little = index;
while (left < heapSize) {
if (kHeap[left] < kHeap[index]) {
little = left;
}
if (right < heapSize && kHeap[right] < kHeap[little]) {
little = right;
}
if (little != index) {
swap(kHeap, little, index);
} else {
break;
}
index = little;
left = index * 2 + 1;
right = index * 2 + 2;
}
}
private void heapInsert(int[] kHeap, int value, int index) {
// TODO Auto-generated method stub
kHeap[index] = value;
while (index != 0) {
int parent = (index - 1) / 2;
if (kHeap[parent] > kHeap[index]) {
swap(kHeap, parent, index);
index = parent;
} else {
break;
}
}
}
private void swap(int[] arr, int i, int j) {
// TODO Auto-generated method stub
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}