题解 | #寻找第K大#
寻找第K大
http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
小顶堆纯手写做法,时间和空间复杂度都很低。将数组的前k个位置作为一个k大小的小顶堆,维持a[0]为这个小顶堆的最小值,然后遍历堆之后的数字与a[0]比较,大于a[0]则交换两值位置并调整堆,遍历完成后则这个小顶堆就是最大的k个值,并且a[0]即为第k大的值。
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
int heapSize = K;
getHeap(a, K);
for(int i = K; i < a.length; i++){
if(a[i] > a[0]){
swap(a, 0, i);
minHeapify(a, 0, heapSize);
}
}
return a[0];
}
private void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private void minHeapify(int[] a, int i, int heapSize){
int smallest = i, left = i * 2 + 1, right = i * 2 + 2;
if(left < heapSize && a[left] < a[smallest]){
smallest = left;
}
if(right < heapSize && a[right] < a[smallest]){
smallest = right;
}
if(smallest != i){
swap(a, i, smallest);
minHeapify(a, smallest, heapSize);
}
}
private void getHeap(int[] a, int heapSize){
for(int i = heapSize/2 -1; i >= 0; i--){
minHeapify(a, i, heapSize);
}
}
}
快手公司福利 1244人发布