1适用场景
求解最大/最小/最频繁的K个元素的题,都遵循这种模式。
求解k类型的最佳数据结构就是堆,堆分为最大堆和最小堆,而堆是通过优先队列来实现的,能够动态维护数据的有序性。
如下找到数组中前3个最大的值
流程:
- 根据题目要求,将K个元素插入到最小堆或是最大堆。
- 遍历剩下的还没访问的元素,如果当前出来到的这个元素比堆顶元素大,那咱们把堆顶元素先删除,再加当前元素进去。
2堆属性
堆的逻辑结构是一棵完全二叉树的数组对象。
堆的物理结构是顺序表(一维数组),非线性数据结构,有两个直接后继。
同时,此处的堆不要与JAVA内存分配中的堆内存混淆。这里讨论的是数据
堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方式。
最大堆
根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其子节点的值大。
最小堆
根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其子节点的值小。
3堆实现
通过优先队列来实现最大堆和最小堆
最大堆:
PriorityQueue<Integer> maxHeapA = new PriorityQueue<>(Comparator.reverseOrder());
PriorityQueue<Integer> maxHeapC = new PriorityQueue<>((o1, o2) -> -o1 + o2);
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) ->o2.compareTo(o1));
最小堆:
PriorityQueue<Integer> minHeapB = new PriorityQueue<>();
PriorityQueue<Integer> minHeap = new PriorityQueue<>((o1, o2) -> o1.compareTo(o2));
PriorityQueue<Integer> maxHeapC = new PriorityQueue<>((o1, o2) -> o1 - o2);
注意: ((o1, o2) ->o2.compareTo(o1)
此处为lambda表达式,语法结构由三部分组成:形参列表;箭头;代码块,形如()->{}
。
继续了解lambda见链接: java中的Lambda表达式
.
5力扣题型总结
- 13337方阵中战斗力最弱的 K 行
- 692前k个高频单词
- 未完待续
4堆常用的方法
boolean offer(E e)
:
boolean add(E e)
E peek()
:获取堆顶元素E poll()
:删除堆顶元素,并返回该元素E remove()
:移除堆顶元素
题型总结目录
题型总结——前K系列(堆、优先队列).
题型总结——二分查找(中间点计算的改进).
题型总结——二维数组(矩阵)之逆逆时针输出、查找.
题型总结——栈的应用.
题型总结——双指针算法全部模型(持续更新).