class Solution {
public int findKthLargest(int[] nums, int k) {
int heapSize=nums.length;
//建堆
buildMaxHeap(nums,heapSize);
for (int i = nums.length - 1; i >= nums.length - k + 1; --i) {
swap(nums, 0, i);
--heapSize;
maxHeapify(nums, 0, heapSize);
}
return nums[0];
}
public void buildMaxHeap(int [] array,int heapSize){
for(int i=heapSize/2;i>=0;i--){
maxHeapify(array,i,heapSize);
}
}
public void maxHeapify(int [] array,int i, int heapSize){
int left=i*2+1,right=i*2+2,largest=i;
if(left<heapSize&&array[left]>array[largest]){
//左节点大于虚拟根节点,则虚拟根节点被左节点替代
largest=left;
}
if(right<heapSize&&array[right]>array[largest]){
//左节点大于虚拟根节点,则虚拟根节点被右节点替代
largest=right;
}
if(largest!=i){
//虚拟根节点和原先根节点不一样
//交换二者的值
swap(array,i,largest);
//递归调整
maxHeapify(array,largest,heapSize);
}
}
public void swap(int [] array,int a,int b){
int t=array[a];
array[a]=array[b];
array[b]=t;
}
}
代码二
class Solution {
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
int pos=n-k;
quickselect(nums, 0, n-1 , pos);
return nums[pos];
}
public void quickselect(int[] nums, int l, int r, int k) {
if(l<r){
int mid=Partition(nums,l,r);
if(mid==k){
return;
}else{
quickselect(nums,l,mid-1,k);
quickselect(nums,mid+1,r,k);
}
}
}
public int Partition(int [] array,int left,int right){
int pos=array[left];
while(left<right){
while(left<right&&array[right]>=pos)right--;
array[left]=array[right];
while(left<right&&array[left]<=pos)left++;
array[right]=array[left];
}
array[left]=pos;
return left;
}
}