lc215在数组中找第k大的元素
找大用小堆。
构造只有k个的小根堆,堆满了之后,并不是所有新来的元素都可以入堆,只有大于根元素的才可以插入到堆中,否则就直接抛弃。
class Solution { public int findKthLargest(int[] nums, int k) { if(k>nums.length){ return -1; } int len=nums.length; PriorityQueue<Integer> minHeap = new PriorityQueue<>(k,(a,b)->a-b); for(int i=0;i<k;i++){ minHeap.add(nums[i]); } for(int i=k;i<len;i++){ Integer topEle = minHeap.peek(); if(nums[i]>topEle){ minHeap.poll(); minHeap.offer(nums[i]); } } return minHeap.peek(); } }
堆排序原理
小顶堆出堆的序列是升序。
大顶堆出堆的序列是降序。