目录
堆的概念
堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于其父节点;
最小堆的每一个节点(除了根结点)的值不小于其父节点。
java中使用PriorityQueue(优先队列)实现堆的功能,且默认为小顶堆。
堆的定义,定义语法可见我的另外一篇博客:https://blog.csdn.net/yezonghui/article/details/115412927
小顶堆的构建过程
注意:就算是相同的数组序列,不同的插入顺序,最终出来的堆都可能不一样,
所以不能直接对完整序列进行处理,需要一个个插入操作。
小顶堆的插入操作:
1)每次插入操作接在最下层空位的最右边,然后进行调整
2)调整的时候从按照从下到上,从右到左的顺序对非叶结点进行调整
(这是因为叶结点显然满足小顶堆的要求)。
每次调整目的都是要保证根结点比孩子结点小,如果不满足,
就与孩子结点中更小的那一个互换,然后再对换下去的结点检查并调整直至到底层或者满足。
3)每次插入都会影响整体的树,所以所有的非叶结点都需要进行调整
题目一:前k个高频元素
(题目链接:https://leetcode-cn.com/problems/top-k-frequent-elements/)
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路:堆排序:记住记住记住:求前k大的元素,我们用小顶堆,小顶堆,小顶堆。
(如何理解:小顶堆的堆顶是最小元素,遇到较大的数,便于被替换)
难点:如何定义这个堆
PriorityQueue<int[]> pqueue = new PriorityQueue<int[]>(
(a,b)->(a[1]-b[1])
);
class Solution {
public int[] topKFrequent(int[] nums, int