题解 | #寻找第K大#
寻找第K大
http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
堆排序是最快的,而且堆排不用全排序完,题目要第几个就排几次就可以直接终止了;
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
for (int i = a.length / 2 - 1; i >= 0; i--) {
// 建堆
buildHeap(a, i, a.length);
}
// 这里不是按照a.length逐次-1,是按照k的大小,即每次将大顶堆根节点换到数组末尾的时候,我就们找到第i个最大值了,i=k时就是结果;
for (int i = 0; i < K; i++) {
swap(a, 0, a.length - 1 - i);
buildHeap(a, 0, a.length - 1 - i);
}
return a[a.length - K];
}
private void buildHeap(int[] arr, int i, int len) {
int tmp = arr[i];
for(int j = 2 * i + 1 ; j < len; j = j * 2 + 1) {
if (j + 1 < len && arr[j] < arr[j + 1]) {
j++;
}
if (tmp < arr[j]) {
arr[i] = arr[j];
i = j;
}
}
arr[i] = tmp;
}
private void swap (int[] arr, int idx1, int idx2) {
int tmp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = tmp;
}
} 

