剑指 Offer II 076. 数组中的第 k 大的数字
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
先放代码在这里,等理解透彻了再写思路。
class Solution {
public int findKthLargest(int[] nums, int k) {
//堆的大小是数组长度
int heapsize = nums.length;
BuildMaxHeap(nums,heapsize);
//一共要删除k-1次
for(int i=nums.length-1;i>=nums.length-k+1;i--){
swap(nums,0,i);
heapsize--;
maxHeap(nums,0,heapsize);
}
return nums[0];
}
//构建大顶堆
public void BuildMaxHeap(int[] a,int heapsize){
for(int i=heapsize/2;i>=0;i--){
maxHeap(a,i,heapsize);
}
}
//调整大顶堆
public void maxHeap(int[] a,int i,int heapsize){
int left=i*2+1,right=i*2+2,lar=i;
if(left<heapsize&&a[left]>a[lar]){
lar=left;
}
if(right<heapsize&&a[right]>a[lar]){
lar=right;
}
if(lar!=i){
swap(a,i,lar);
maxHeap(a,lar,heapsize);
}
}
//数组中两个值进行交换
public void swap(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}