小根堆就是小顶堆,大根堆就是大顶堆,一个意思。
类型可以是Queue,也可以是PriorityQueue,这里直接用Queue也行
新建一个小根堆
Queue<Integer>A=new PriorityQueue<>();
新建一个大根堆
Queue<Integer> maxHeap = new PriorityQueue<>((x,y) -> (y-x));
1、求出一个数组中第K大的数
解法思路:用小根堆,根堆有k个节点,最小的节点是根,也就是数组中第K大的数
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
//小根堆做法:获取最大的K个数,然后最小的为根,这个根就是第K大的值
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for(int i=0;i<n;i++){
if(minHeap.size() < K){ //先填满小跟堆
minHeap.add(a[i]);
}else if(a[i] > minHeap.peek()){ //大于堆顶,则替换
minHeap.remove();
minHeap.add(a[i]);
}
}
return minHeap.peek();
}
}
2、求出一个数组中的第K小的数
解法思路:用大根堆,根堆有k个节点,最大的节点是根,也就是数组中第K小的数
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
//大根堆做法:获取最小的K个数,然后最大的为根,这个根就是第K小的值
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((x,y) -> (y-x));
for(int i=0;i<n;i++){
if(maxHeap.size() < K){ //先填满大跟堆
maxHeap.add(a[i]);
}else if(a[i] < maxHeap.peek()){ //小于堆顶,则替换
maxHeap.remove();
maxHeap.add(a[i]);
}
}
return maxHeap.peek();
}
}