215. 数组中的第K个最大元素
在未排序的数组中找到第 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
思路
与 703 如出一辙, 还是 TOP K问题,第K大元素,直接建立K个元素的小根堆,堆顶就是 第K大的元素,也是这K个元素中最小的
class Solution {
int[] heap;
int size = 0;
int count = 0;
public int findKthLargest(int[] nums, int k) {
heap = new int[k];
count = k;
for(int i : nums)insert(i);
return heap[0];
}
public void insert(int val){
if(size < count){
heap[size] = val;
up();
size++;
}
else{
if(heap[0] < val){
heap[0] = val;
down(0);
}
}
}
public void up(){
int i = size;
int fa = (int)Math.ceil((i / 2.0)) - 1;
while(fa >= 0 && heap[fa] > heap[i]){
int temp = heap[i];
heap[i] = heap[fa];
heap[fa] = temp;
i = fa;
fa = (int)Math.ceil((i / 2.0)) - 1;
}
}
public void down(int i){
int child = i * 2 + 1;
int t = i;
if(child < size){
if(child + 1 < size && heap[child + 1] < heap[child])child = child + 1;
if(heap[child] < heap[i]){
int temp = heap[child];
heap[child] = heap[i];
heap[i] = temp;
i = child;
}
if(t != i)down(i);
}
}
}