问题描述:
从数组arr[1…n]中,找出最大的K个数
方法一:堆排序
排序算法参考:十大排序算法总结
思路:
只找到topk,不排序topk。
- 先用前k个元素生成一个小顶堆(即父节点比子节点小的完全二叉树),这个小顶堆用于存储当前最大的k个元素。
- 接着,从第k+1个元素开始扫描,和堆顶(堆中最小元素)进行比较,如果被扫描的元素大于堆顶则替换堆顶的元素,并调整堆,以保证堆内的k个元素总是当前最大的k个元素。
- 扫描完所有n-k个元素,最终堆中的k个元素就是topk
采用优先队列:
下面的代码的目的是利用优先队列得到第k大元素
import java.util.PriorityQueue;
public class Solution{
public int findKthLargest(int[] nums, int k){
int len = nums.length;
// 使用一个含有k个元素的最小堆
PriorityQUeue<Integer> minHeap = new Priority<>(k,(a,b)->a-b);
for(int i = 0; i<k;i++){
minHeap.add(nums[i]);
}
for(int i = k; i<len;i++