题型总结——前K系列(堆、优先队列)

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系列(堆、优先队列).
题型总结——二分查找(中间点计算的改进).
题型总结——二维数组(矩阵)之逆逆时针输出、查找.
题型总结——栈的应用.
题型总结——双指针算法全部模型(持续更新).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值