Heap解题套路

Heap的知识

  • Heap 的操作
    • 从数组创建heap:使用siftDown. O(n)
    • 调整heap: siftUp, siftDown (heapify) 两种, O(log n) 【可以使用递归 和 循环两种写法】
      • 一般是添加一个元素,在末尾: 使用siftUp
      • 去掉堆顶元素,将队尾元素放到堆顶: 使用siftDown
    • 获取堆顶元素(最小值/最大值) O(1)
  • heap的时间复杂度
  • heap的实际使用:java语言PriorityQueue,构造方法可以接收一个参数,lambda写比较器
    • 例如:PriorityQueue heap = new PriorityQueue<>((x, y) -> x.val - y.val);
    • 堆排序时,我习惯的写法是,先使用siftDown建堆,然后再依次将最大值取出放到末尾,再使用siftDown调整。所以,需要特别熟悉siftDown的操作(heapify)

练习题目

215. 数组中的第K个最大元素 - 力扣(LeetCode)

23. 合并K个升序链表 - 力扣(LeetCode)

347. 前 K 个高频元素 - 力扣(LeetCode)

295. 数据流的中位数 - 力扣(LeetCode)

767. 重构字符串 - 力扣(LeetCode)

703. 数据流中的第 K 大元素 - 力扣(LeetCode)

posted @ 2023-05-21 10:07  编程爱好者-java  阅读(9)  评论(0编辑  收藏  举报