题目:
在未排序的数组中找到第 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
思路:
创建一个小顶堆,堆的大小为 k ,用于存放最大的 k 个元素。遍历整个数组 nums ,将每次遍历的元素与小顶堆的顶元素(即堆中最小的元素)num 进行比较,如果大于num则替换该元素,并重新堆化小顶堆。直到遍历整个数组,则此时小顶堆中最小的元素即为 数组第 k 个最大的元素
Java代码
public int findKthLargest(int[] nums, int k) {
int[] tmp = new int[k];
for(int i=0;i<k;i++){
tmp[i] = nums[i];
}
for(int i=k;i<nums.length;i++){
findMinNums(nums[i],tmp);
}
return tmp[0];
}
public void updateArray(int[] tmp){
for(int j=0;j<=tmp.length/2;j++)
for(int i=tmp.length/2;i>=j;i--){
int index = 2*i + 1;
if(index>tmp.length-1){
continue;
}
if(2*i+2<tmp.length&&tmp[index]>tmp[2*i+2]){
index = 2*i+2;
}
if(tmp[i]>tmp[index]){
swap(tmp,i,index);
}
printArray(tmp);
}
}
public void findMinNums(int num,int[] tmp){
updateArray(tmp);
if(num>tmp[0]){
tmp[0] = num;
updateArray(tmp);
}
}
public void swap(int[] tmp,int i,int j){
int t = tmp[i];
tmp[i] = tmp[j];
tmp[j] = t;
}