在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
class Solution {
int [] arr=null;
public int findKthLargest(int[] nums, int k) {
//维持一个大小为k的堆
return solve(nums,k);
}
public int solve(int [] nums,int k){
arr=new int [k];
for(int i=0;i<k;i++)
arr[i]=nums[i];
//建大小为k的小顶堆
buildheap(arr);
for(int j=k;j<nums.length;j++){
if(nums[j]<arr[0]){
continue;
}else{
//下沉到合适位置
arr[0]=nums[j];
adjust(arr,0,k);
}
}
return arr[0];
}
public static void buildheap(int [] arr){
for(int i=arr.length/2;i>=0;i--)
adjust(arr,i,arr.length);
}
//k为当前需要调整的根结点的索引,length为整个序列中要调整的个数
public static void adjust(int [] arr,int k,int length){
int before=arr[k];
for(int i=2*k;i<length;i*=2){
if(i<length-1&&arr[i]>arr[i+1]){
i++;
}
if(before<=arr[i]){
break;
}else{
arr[k]=arr[i];
arr[i]=before;
k=i;
}
}
}
}