堆(heap)
堆的概念:
- 是完全二叉树;
- 每个节点 >= 或 <= 孩子节点。
条件二中分别对应:最大堆和最小堆。
最大堆:最大值为堆顶元素,每个节点 >= 孩子节点。
最小堆:最小值为堆顶元素,每个节点 <= 孩子节点。
python中的堆
python中只能直接创建最小堆。如果想要创建最大堆可以先将所有元素乘负一(取反),然后最小堆化,取元素的时候再取反,这样相当于得到最大堆。
应用:top – K、第K个最大值,每次可以取出最大(最小元素)
堆化:把一组无序的数加到堆里面。
注意:堆化操作的时间复杂度为O(N),排序算法的时间复杂度为O(NlogN)
引入方法:将列表堆化,再进行相关操作。
Import heapq
heap = [ ]
- heapq.heapify(heap):将堆属性应用到列表上(堆化操作)。
- heapq.heappush(heap, item):将 item 元素加入堆。
- heapq.heappop(heap):弹出堆顶元素(也就是最小值)
- heapq.heapreplace(heap, x):弹出堆顶元素,并将元素x 入堆。
- heapq.merge(*iterables, key=None, reverse=False):将多个有序的堆合并成一个大的有序堆,然后再输出。
- heapq.heappushpop(heap, item):将item 入堆,然后弹出并返回堆中最小的元素。
- heapq.nlargest(n, iterable, key=None):返回堆中最大的 n 个元素。
- heapq.nsmallest(n, iterable, key=None):返回堆中最小的 n 个元素。
代码实战
实战一:用最小堆,解决数组中第K个最大元素的问题。
代码部分:
import heapq
class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 最小堆把n-k小的元素都取出来,下一次取的时候就是第K个最大值了heapq.heapify(nums)while len(nums) > k:heapq.heappop(nums)return nums[0]
实战二:用哈希表 + 最小堆 解决前K高频单词的问题
代码部分:方法二待更新……
class Solution:def topKFrequent(self, words: List[str], k: int) -> List[str]:# 方法一:哈希表 + 排序count = {}for word in words:count[word] = count.get(word,0) + 1sorted_list = sorted(count.items(), key=lambda item: (-item[1], item[0]))return [item[0] for item in sorted_list][:k]# 方法二:哈希表 + 最小堆 待更新……import heapq
参考资料
leetcode 题库例题