class Solution {
public int findKthLargest(int[] nums, int k) {
int heapSize =nums.length;
buildMaxHeap(nums,heapSize);
for(int i=heapSize-1;i>heapSize-k;--i){
swap(nums,0,i);
//这里的i应该理解为当前节点下标碰巧为其前面所有节点的个数
maxHeapify(nums,i,0);
}
return nums[0];
}
public void buildMaxHeap(int[]a,int heapSize){
for(int i=heapSize/2-1;i>=0;--i){
maxHeapify(a,heapSize,i);
}
}
//调整位置为i的节点
public void maxHeapify(int[] a,int heapSize,int i){
int leftSon=i*2+1;
int rightSon=i*2+2;
int largest=i;
if(leftSon<heapSize&&a[leftSon]>a[largest]){
largest=leftSon;
}
if(rightSon<heapSize&&a[rightSon]>a[largest]){
largest=rightSon;
}
if(largest!=i){
swap(a,largest,i);
maxHeapify(a,heapSize,largest);
}
}
public void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
大根堆方法:建立一个大根堆,删除 k - 1次根节点(即把根与正确位置元素交换,再调整交换到根节点的节点)后堆顶元素就是我们要找的答案。