class Solution {
public int findKthLargest(int[] nums, int k) {
for(int i=nums.length/2-1;i>=0;i--){//nums.length/2-1为第一个非叶子结点,依次对每个非叶子结点进行堆排序(本题是大顶堆)
adjustHeap(nums,i,nums.length);
}
//初次大顶堆构建完成,将堆顶与最后一个元素进行交换,交换后再调整为大顶堆
for(int i=nums.length-1;i>0;i--){
int temp=nums[i];
nums[i]=nums[0];//nums[0]永远是堆顶,并且为每次堆排序后的最大值
nums[0]=temp;
adjustHeap(nums,0,i);//交换后排除最后一个元素(形参传入的length会减一),将剩余的重新进行堆排序
}
return nums[nums.length-k];
}
public void adjustHeap(int[]nums,int i,int length){
int temp=nums[i];//先保存堆顶的值,用于最后一次交换
for(int j=i*2+1;j<length;j=j*2+1){
if(j+1<length&&nums[j+1]>nums[j]){
j++;//记录两个子节点中较大的那个值下标
}
if(nums[j]>temp){//通过用i记录j的下标模拟已经交换
nums[i]=nums[j];
i=j;//记录未交换的j的下标
}else{
break;
}
}
nums[i]=temp;
}
}
leetcode215. 数组中的第K个最大元素堆排序
最新推荐文章于 2024-04-08 15:26:06 发布